diff --git a/.distignore b/.distignore new file mode 100644 index 0000000..09c71ef --- /dev/null +++ b/.distignore @@ -0,0 +1,34 @@ +/.wordpress-org +/.git +/.github +/.cursor +/node_modules +/tests +/bin +/vendor/bin +/vendor/squizlabs +/vendor/phpunit +/vendor/phpstan +/vendor/dealerdirect +/vendor/wp-coding-standards +/vendor/phpcompatibility +/vendor/sirbrillig +/vendor/phpcsstandards + +.distignore +.gitignore +.editorconfig +.wp-env.json +.phpcs.xml +phpcs.xml +phpunit.xml +phpstan.neon +package.json +package-lock.json +bun.lock +CODE_OF_CONDUCT.md +CITATION.cff +notes +*.bak +.env +.env.example diff --git a/CODE_OF_CONDUCT.md b/.github/CODE_OF_CONDUCT.md similarity index 100% rename from CODE_OF_CONDUCT.md rename to .github/CODE_OF_CONDUCT.md diff --git a/.gitignore b/.gitignore index c7697f8..3d1e14d 100644 --- a/.gitignore +++ b/.gitignore @@ -11,17 +11,29 @@ # Dev dependencies node_modules/ vendor +.env # Tests +tests/playwright/test-results/ +tests/playwright/playwright-report/ +tests/playwright/.cache/ tests/test-results/ tests/playwright-report/ tests/blob-report/ -tests/playwright/.cache/ +playwright-report/ +test-results/ tests/.auth/ tests/phpunit/.cache +tests/backstop/backstop_data/bitmaps_test/ +tests/backstop/backstop_data/html_report/ +tests/backstop/backstop_data/ci_report/ +tests/backstop/backstop_data/json_report/ # Build build/* # WordPress wordpress/ + +# Python +__pycache__/ diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..521a9f7 --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +legacy-peer-deps=true diff --git a/.wp-env.json b/.wp-env.json index 29a63b6..b2b9780 100644 --- a/.wp-env.json +++ b/.wp-env.json @@ -2,7 +2,9 @@ "core": null, "phpVersion": "7.4", "themes": ["WordPress/twentytwentyfive"], - "plugins": [], + "plugins": [ + "https://downloads.wordpress.org/plugin/plugin-check.zip" + ], "mappings": { "wp-content/plugins/cooked": "." }, diff --git a/CITATION.cff b/CITATION.cff index 6a63f36..e7f6023 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -6,7 +6,7 @@ authors: given-names: Justin - family-names: Tresova given-names: Armand -version: 1.16.0 +version: 1.16.1 doi: 10.5281/zenodo.1171250 date-released: 2017-05-08 url: "https://github.com/XjSv/cooked" diff --git a/SECURITY.md b/SECURITY.md index 019492e..850d6bc 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -5,8 +5,8 @@ Versions that are currently being supported with security updates. | Version | Supported | | ----------- | ------------------ | -| 1.15.0 | :white_check_mark: | -| <= 1.14.0 | :x: | +| 1.16.1 | :white_check_mark: | +| <= 1.16.1 | :x: | ## Reporting a Vulnerability diff --git a/assets/admin/css/style.css b/assets/admin/css/style.css index a9bab1f..f736ee4 100644 --- a/assets/admin/css/style.css +++ b/assets/admin/css/style.css @@ -30,9 +30,21 @@ td.column-featured_image { width:50px; text-align:center; } 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; } -/* TinyMCE fullscreen above admin menu and Cooked sticky UI */ -body.post-type-cp_recipe .mce-fullscreen { - z-index: 100100 !important; +body.mce-fullscreen #cooked-recipe-tabs { + z-index: auto; +} + +body.mce-fullscreen #adminmenumain { + display: none; +} + +body.mce-fullscreen #cooked_recipe_settings .wp-editor-wrap:not(:has(.mce-fullscreen)), +body.mce-fullscreen #cooked-directions-builder .cooked-direction-block:not(:has(.mce-fullscreen)) { + visibility: hidden; +} + +body.mce-fullscreen div.mce-tinymce.mce-fullscreen { + z-index: 100010; } #cooked-settings-prewrap { display:flex; justify-content:center; } @@ -56,7 +68,18 @@ body.post-type-cp_recipe .mce-fullscreen { #cooked-settings-wrap.is-stuck .cooked-settings-update-button { position:fixed; top:35px; right:11px; z-index:100001; } -#cooked-recipe-tabs { list-style:none; padding:0; margin:0; position:absolute; top:0; left:0; width:100%; } +#cooked-recipe-tabs { + list-style:none; + padding:0; + margin:0; + position:sticky; + top: var(--wp-admin--admin-bar--height, 0px); + z-index: 1000; + width:100%; +} +#cooked_recipe_settings.stuck #cooked-recipe-tabs { + box-shadow: 0 3px 50px rgba(0,0,0,0.25); +} #cooked-recipe-tabs li { font-size:0.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, @@ -66,18 +89,7 @@ body.post-type-cp_recipe .mce-fullscreen { #cooked-recipe-tabs li.cooked-loading:hover { background:none; color:#fff; } #cooked_recipe_settings.cooked-loading #cooked-recipe-tabs li.cooked-loading { opacity:1; } -#cooked_recipe_settings .inside { padding-top:60px; margin: 0} -#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,0.25); -} - -#cooked_recipe_settings.stuck #cooked-recipe-tabs li.cooked-loading { right:160px; } +#cooked_recipe_settings .inside { padding: 0; margin: 0} .cooked-recipe-tab-content-wrapper .cooked-recipe-tab-content { display:none; } .cooked-recipe-tab-content-wrapper .cooked-recipe-tab-content:first-child { display:block; } @@ -159,7 +171,10 @@ body.post-type-cp_recipe .mce-fullscreen { #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_recipe_settings .recipe-setting-block .cooked-html-block.expired, +#cooked_recipe_settings .recipe-setting-block .cooked-html-block.invalid { border:2px solid #ca4a20; } +#cooked_recipe_settings .recipe-setting-block .cooked-html-block.expired > .cooked-settings-title, +#cooked_recipe_settings .recipe-setting-block .cooked-html-block.invalid > .cooked-settings-title { color:#ca4a20; } /* Heading Element Styles */ #cooked-ingredients-builder .cooked-ingredient-block:hover > .cooked-heading-name, @@ -424,7 +439,6 @@ body .button.button-cooked-reset:hover { color:#555; } overflow-x: auto; scrollbar-width: none; -ms-overflow-style: none; - top: 0; width: 100%; } #cooked-recipe-tabs::-webkit-scrollbar { @@ -433,13 +447,6 @@ body .button.button-cooked-reset:hover { color:#555; } #cooked-recipe-tabs li { float: none; } - #cooked_recipe_settings.stuck #cooked-recipe-tabs { - position: fixed; - top: 32px; - left: 0; - width: 100%; - margin-left: 0; - } } /* Recipe Gallery */ @@ -753,19 +760,7 @@ body .button.button-cooked-reset:hover { color:#555; } #cooked-recipe-tabs li .cooked-icon { display:none; } } -@media screen and ( max-width: 960px ) { - #cooked_recipe_settings.stuck #cooked-recipe-tabs { margin-left:36px; } -} - @media screen and ( max-width: 768px ) { - #cooked_recipe_settings.stuck #cooked-recipe-tabs { - position: absolute; - top: 0; - left: 0; - width: 100%; - margin-left: 0; - box-shadow: 0 3px 50px rgba(0,0,0,0.25); - } #cooked_recipe_settings .cooked-clearfix:has(> .cooked-setting-column-14) { display: grid; grid-template-columns: 1fr 1fr; @@ -784,6 +779,9 @@ body .button.button-cooked-reset:hover { color:#555; } } @media screen and ( max-width: 600px ) { + #cooked-recipe-tabs { + top: 0; + } #cooked_recipe_settings .recipe-setting-block h3.cooked-settings-title { display: flex; flex-wrap: wrap; @@ -909,10 +907,6 @@ body .button.button-cooked-reset:hover { color:#555; } #cooked_recipe_settings .cooked-clearfix:has(> .cooked-setting-column-14) { grid-template-columns: 1fr; } - - #cooked_recipe_settings.stuck #cooked-recipe-tabs { - width: 100%; - } } /* Substitution Fields */ diff --git a/assets/admin/css/style.min.css b/assets/admin/css/style.min.css index 11547ac..0b777e2 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:35px;right:11px;z-index:100001}#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:60px;margin:0}#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:250px;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:135px;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:175px;padding-right:175px}#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;padding-right:175px}#cooked-directions-builder .cooked-direction-block.cooked-direction-has-number-wide>.cooked-direction-content{padding-left:185px;padding-right:175px}#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:280px;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-video{width:135px;position:absolute;top:15px;right:25px}#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-settings-image-field{position:relative;display:inline-block;max-width:150px}.cooked-settings-image-field .cooked-settings-image-preview-img{display:none;width:100%;height:auto;margin:10px 0 0;border-radius:3px}.cooked-settings-image-field .cooked-settings-image-remove{display:none;position:absolute;top:50px;right:0;padding:10px;background:rgba(0,0,0,.25);color:#fff;border-radius:3px}.cooked-settings-image-field.cooked-has-image .cooked-settings-image-remove{display:inline-block}.cooked-settings-image-field.cooked-has-image .cooked-settings-image-remove:hover{background:#ff0100}.cooked-settings-image-field.cooked-has-image .cooked-settings-image-preview-img{display:block}#cooked-directions-builder .cooked-direction-block>.cooked-direction-video .cooked-direction-video-preview{display:none;width:100%;aspect-ratio:1/1;object-fit:cover;border-radius:3px;cursor:pointer}#cooked-directions-builder .cooked-direction-block>.cooked-direction-video .cooked-direction-video-placeholder{box-sizing:border-box;cursor:pointer;border-radius:3px;width:100%;padding-bottom:100%;background:0 0;border:2px dashed #ddd;margin-top:15px}#cooked-directions-builder .cooked-direction-block>.cooked-direction-video .cooked-direction-video-placeholder:hover{background:#ddd;border:2px solid #ddd}#cooked-directions-builder .cooked-direction-block>.cooked-direction-video .direction-video-button{width:100%;text-align:center}#cooked-directions-builder .cooked-direction-block>.cooked-direction-video.cooked-has-video .cooked-direction-video-placeholder{display:none}#cooked-directions-builder .cooked-direction-block>.cooked-direction-video.cooked-has-video .cooked-direction-video-preview{display:block;width:100%;aspect-ratio:1/1;object-fit:cover;margin-top:15px}#cooked-directions-builder .cooked-direction-block>.cooked-direction-video .remove-video-button{display:none;position:absolute;top:43px;right:15px}#cooked-directions-builder .cooked-direction-block>.cooked-direction-video.cooked-has-video .remove-video-button{display:inline-block;padding:10px;background:rgba(0,0,0,.25);color:#fff}#cooked-directions-builder .cooked-direction-block>.cooked-direction-video.cooked-has-video .remove-video-button:hover{background:#ff0100}@media screen and (max-width:1440px){#cooked-directions-builder .cooked-direction-block:not(.cooked-direction-heading){display:grid;grid-template-columns:1fr 1fr;grid-template-areas:"content content" "image video";gap:10px;padding:15px 0 15px 0}#cooked-directions-builder .cooked-direction-block:not(.cooked-direction-heading)>.cooked-direction-content{grid-area:content;padding:14px 14px 0 14px!important;min-height:80px}#cooked-directions-builder .cooked-direction-block:not(.cooked-direction-heading)>.cooked-direction-image{grid-area:image;position:relative;width:auto;left:auto;top:auto;padding-left:15px;padding-right:0}#cooked-directions-builder .cooked-direction-block:not(.cooked-direction-heading)>.cooked-direction-video{grid-area:video;position:relative;width:auto;right:auto;top:auto}#cooked_recipe_settings .cooked-recipe-tab-content{padding:0 0 15px 0}#cooked-recipe-tabs{white-space:nowrap;overflow-x:auto;scrollbar-width:none;-ms-overflow-style:none;top:0;width:100%}#cooked-recipe-tabs::-webkit-scrollbar{display:none}#cooked-recipe-tabs li{float:none}#cooked_recipe_settings.stuck #cooked-recipe-tabs{position:fixed;top:32px;left:0;width:100%;margin-left:0}}#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}}@media screen and (max-width:768px){#cooked_recipe_settings.stuck #cooked-recipe-tabs{position:absolute;top:0;left:0;width:100%;margin-left:0;box-shadow:0 3px 50px rgba(0,0,0,.25)}#cooked_recipe_settings .cooked-clearfix:has(>.cooked-setting-column-14){display:grid;grid-template-columns:1fr 1fr;gap:10px}#cooked_recipe_settings .cooked-setting-column-14{width:100%;float:none;padding-right:0}#cooked_recipe_settings .recipe-setting-block h3.cooked-settings-title{width:60%}}@media screen and (max-width:600px){#cooked_recipe_settings .recipe-setting-block h3.cooked-settings-title{display:flex;flex-wrap:wrap;align-items:center;row-gap:10px}#cooked_recipe_settings .recipe-setting-block:has(#cooked-nutrition-label) .cooked-setting-column-12{width:100%;float:none;padding-right:0}#cooked_recipe_settings .recipe-setting-block:has(#cooked-nutrition-label) p.cooked-measurement-inputs{display:flex;gap:10px}#cooked_recipe_settings .recipe-setting-block:has(#cooked-nutrition-label) p.cooked-measurement-inputs .cooked-measurement-column{width:50%;margin-right:0;flex:1}#cooked-ingredients-builder .cooked-ingredient-block{display:grid;grid-template-columns:1fr 1fr;column-gap:8px;row-gap:4px;padding-left:30px;padding-right:35px}#cooked-ingredients-builder .cooked-ingredient-block>div{display:block;float:none;padding-right:0}#cooked-ingredients-builder .cooked-ingredient-block>.cooked-ingredient-amount{width:auto;grid-column:1}#cooked-ingredients-builder .cooked-ingredient-block>.cooked-ingredient-measurement{width:auto;grid-column:2}#cooked-ingredients-builder .cooked-ingredient-block>.cooked-ingredient-name{width:auto;grid-column:1/-1;padding-right:40px}#cooked-ingredients-builder .cooked-ingredient-block>.cooked-substitution-fields{width:auto;float:none;clear:none;grid-column:1/-1}#cooked-ingredients-builder .cooked-ingredient-block>.cooked-heading-name{grid-column:1/-1}#cooked_recipe_settings .cooked-ingredient-headers{display:grid;grid-template-columns:1fr 1fr;padding-left:30px;padding-right:35px}#cooked_recipe_settings .cooked-ingredient-headers span{display:block;float:none}#cooked_recipe_settings .cooked-layout-save-default{margin:0}#cooked_recipe_settings .cooked-ingredient-headers span.cooked-ingredient-header-amount{width:auto}#cooked_recipe_settings .cooked-ingredient-headers span.cooked-ingredient-header-measurement{width:auto}#cooked_recipe_settings .cooked-ingredient-headers span.cooked-ingredient-header-item{width:auto;grid-column:1/-1;padding-top:2px}#cooked-ingredients-builder .cooked-ingredient-block.cooked-expanded>.cooked-substitution-fields{display:grid;grid-template-columns:1fr 1fr;column-gap:8px;row-gap:4px}#cooked-ingredients-builder .cooked-ingredient-block.cooked-expanded>.cooked-substitution-fields>div{display:block;float:none;padding-right:0}#cooked-ingredients-builder .cooked-ingredient-block.cooked-expanded>.cooked-substitution-fields .cooked-ingredient-amount,#cooked-ingredients-builder .cooked-ingredient-block.cooked-expanded>.cooked-substitution-fields .cooked-ingredient-measurement{width:100%;display:block}#cooked-ingredients-builder .cooked-ingredient-block.cooked-expanded>.cooked-substitution-fields .cooked-ingredient-name{width:auto;grid-column:1/-1;padding-top:0}#cooked-ingredients-builder .cooked-ingredient-block.cooked-expanded>.cooked-substitution-fields .cooked-sub-label{grid-column:1/-1}#cooked-ingredients-builder .cooked-ingredient-block{position:relative}#cooked-ingredients-builder .cooked-ingredient-block .cooked-show-substitution{top:60px;right:42px}#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{right:42px}#cooked-ingredients-builder .cooked-ingredient-block .cooked-delete-ingredient{right:11px}}@media screen and (max-width:500px){#cooked_recipe_settings .cooked-clearfix:has(>.cooked-setting-column-14){grid-template-columns:1fr}#cooked_recipe_settings.stuck #cooked-recipe-tabs{width:100%}}#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}#cooked_allergens .cooked-allergens-checkboxes{display:flex;flex-direction:column;gap:8px}#cooked_allergens .cooked-allergen-checkbox{display:flex;align-items:center;gap:8px;cursor:pointer}#cooked_allergens .cooked-allergen-checkbox input[type=checkbox]{margin:0}#cooked_allergens .cooked-allergen{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0}#cooked_allergens .cooked-allergen .cooked-icon{font-size:1.5rem;line-height:1}#cooked_allergens .cooked-allergen,#cooked_allergens .cooked-allergen .cooked-icon{color:rgba(0,0,0,.4)}#cooked_allergens .cooked-allergen-label{font-size:13px;color:#333} \ 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.mce-fullscreen #cooked-recipe-tabs{z-index:auto}body.mce-fullscreen #adminmenumain{display:none}body.mce-fullscreen #cooked-directions-builder .cooked-direction-block:not(:has(.mce-fullscreen)),body.mce-fullscreen #cooked_recipe_settings .wp-editor-wrap:not(:has(.mce-fullscreen)){visibility:hidden}body.mce-fullscreen div.mce-tinymce.mce-fullscreen{z-index:100010}#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:35px;right:11px;z-index:100001}#cooked-recipe-tabs{list-style:none;padding:0;margin:0;position:sticky;top:var(--wp-admin--admin-bar--height,0);z-index:1000;width:100%}#cooked_recipe_settings.stuck #cooked-recipe-tabs{box-shadow:0 3px 50px rgba(0,0,0,.25)}#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:0;margin:0}.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,#cooked_recipe_settings .recipe-setting-block .cooked-html-block.invalid{border:2px solid #ca4a20}#cooked_recipe_settings .recipe-setting-block .cooked-html-block.expired>.cooked-settings-title,#cooked_recipe_settings .recipe-setting-block .cooked-html-block.invalid>.cooked-settings-title{color:#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:250px;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:135px;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:175px;padding-right:175px}#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;padding-right:175px}#cooked-directions-builder .cooked-direction-block.cooked-direction-has-number-wide>.cooked-direction-content{padding-left:185px;padding-right:175px}#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:280px;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-video{width:135px;position:absolute;top:15px;right:25px}#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-settings-image-field{position:relative;display:inline-block;max-width:150px}.cooked-settings-image-field .cooked-settings-image-preview-img{display:none;width:100%;height:auto;margin:10px 0 0;border-radius:3px}.cooked-settings-image-field .cooked-settings-image-remove{display:none;position:absolute;top:50px;right:0;padding:10px;background:rgba(0,0,0,.25);color:#fff;border-radius:3px}.cooked-settings-image-field.cooked-has-image .cooked-settings-image-remove{display:inline-block}.cooked-settings-image-field.cooked-has-image .cooked-settings-image-remove:hover{background:#ff0100}.cooked-settings-image-field.cooked-has-image .cooked-settings-image-preview-img{display:block}#cooked-directions-builder .cooked-direction-block>.cooked-direction-video .cooked-direction-video-preview{display:none;width:100%;aspect-ratio:1/1;object-fit:cover;border-radius:3px;cursor:pointer}#cooked-directions-builder .cooked-direction-block>.cooked-direction-video .cooked-direction-video-placeholder{box-sizing:border-box;cursor:pointer;border-radius:3px;width:100%;padding-bottom:100%;background:0 0;border:2px dashed #ddd;margin-top:15px}#cooked-directions-builder .cooked-direction-block>.cooked-direction-video .cooked-direction-video-placeholder:hover{background:#ddd;border:2px solid #ddd}#cooked-directions-builder .cooked-direction-block>.cooked-direction-video .direction-video-button{width:100%;text-align:center}#cooked-directions-builder .cooked-direction-block>.cooked-direction-video.cooked-has-video .cooked-direction-video-placeholder{display:none}#cooked-directions-builder .cooked-direction-block>.cooked-direction-video.cooked-has-video .cooked-direction-video-preview{display:block;width:100%;aspect-ratio:1/1;object-fit:cover;margin-top:15px}#cooked-directions-builder .cooked-direction-block>.cooked-direction-video .remove-video-button{display:none;position:absolute;top:43px;right:15px}#cooked-directions-builder .cooked-direction-block>.cooked-direction-video.cooked-has-video .remove-video-button{display:inline-block;padding:10px;background:rgba(0,0,0,.25);color:#fff}#cooked-directions-builder .cooked-direction-block>.cooked-direction-video.cooked-has-video .remove-video-button:hover{background:#ff0100}@media screen and (max-width:1440px){#cooked-directions-builder .cooked-direction-block:not(.cooked-direction-heading){display:grid;grid-template-columns:1fr 1fr;grid-template-areas:"content content" "image video";gap:10px;padding:15px 0 15px 0}#cooked-directions-builder .cooked-direction-block:not(.cooked-direction-heading)>.cooked-direction-content{grid-area:content;padding:14px 14px 0 14px!important;min-height:80px}#cooked-directions-builder .cooked-direction-block:not(.cooked-direction-heading)>.cooked-direction-image{grid-area:image;position:relative;width:auto;left:auto;top:auto;padding-left:15px;padding-right:0}#cooked-directions-builder .cooked-direction-block:not(.cooked-direction-heading)>.cooked-direction-video{grid-area:video;position:relative;width:auto;right:auto;top:auto}#cooked_recipe_settings .cooked-recipe-tab-content{padding:0 0 15px 0}#cooked-recipe-tabs{white-space:nowrap;overflow-x:auto;scrollbar-width:none;-ms-overflow-style:none;width:100%}#cooked-recipe-tabs::-webkit-scrollbar{display:none}#cooked-recipe-tabs li{float:none}}#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:768px){#cooked_recipe_settings .cooked-clearfix:has(>.cooked-setting-column-14){display:grid;grid-template-columns:1fr 1fr;gap:10px}#cooked_recipe_settings .cooked-setting-column-14{width:100%;float:none;padding-right:0}#cooked_recipe_settings .recipe-setting-block h3.cooked-settings-title{width:60%}}@media screen and (max-width:600px){#cooked-recipe-tabs{top:0}#cooked_recipe_settings .recipe-setting-block h3.cooked-settings-title{display:flex;flex-wrap:wrap;align-items:center;row-gap:10px}#cooked_recipe_settings .recipe-setting-block:has(#cooked-nutrition-label) .cooked-setting-column-12{width:100%;float:none;padding-right:0}#cooked_recipe_settings .recipe-setting-block:has(#cooked-nutrition-label) p.cooked-measurement-inputs{display:flex;gap:10px}#cooked_recipe_settings .recipe-setting-block:has(#cooked-nutrition-label) p.cooked-measurement-inputs .cooked-measurement-column{width:50%;margin-right:0;flex:1}#cooked-ingredients-builder .cooked-ingredient-block{display:grid;grid-template-columns:1fr 1fr;column-gap:8px;row-gap:4px;padding-left:30px;padding-right:35px}#cooked-ingredients-builder .cooked-ingredient-block>div{display:block;float:none;padding-right:0}#cooked-ingredients-builder .cooked-ingredient-block>.cooked-ingredient-amount{width:auto;grid-column:1}#cooked-ingredients-builder .cooked-ingredient-block>.cooked-ingredient-measurement{width:auto;grid-column:2}#cooked-ingredients-builder .cooked-ingredient-block>.cooked-ingredient-name{width:auto;grid-column:1/-1;padding-right:40px}#cooked-ingredients-builder .cooked-ingredient-block>.cooked-substitution-fields{width:auto;float:none;clear:none;grid-column:1/-1}#cooked-ingredients-builder .cooked-ingredient-block>.cooked-heading-name{grid-column:1/-1}#cooked_recipe_settings .cooked-ingredient-headers{display:grid;grid-template-columns:1fr 1fr;padding-left:30px;padding-right:35px}#cooked_recipe_settings .cooked-ingredient-headers span{display:block;float:none}#cooked_recipe_settings .cooked-layout-save-default{margin:0}#cooked_recipe_settings .cooked-ingredient-headers span.cooked-ingredient-header-amount{width:auto}#cooked_recipe_settings .cooked-ingredient-headers span.cooked-ingredient-header-measurement{width:auto}#cooked_recipe_settings .cooked-ingredient-headers span.cooked-ingredient-header-item{width:auto;grid-column:1/-1;padding-top:2px}#cooked-ingredients-builder .cooked-ingredient-block.cooked-expanded>.cooked-substitution-fields{display:grid;grid-template-columns:1fr 1fr;column-gap:8px;row-gap:4px}#cooked-ingredients-builder .cooked-ingredient-block.cooked-expanded>.cooked-substitution-fields>div{display:block;float:none;padding-right:0}#cooked-ingredients-builder .cooked-ingredient-block.cooked-expanded>.cooked-substitution-fields .cooked-ingredient-amount,#cooked-ingredients-builder .cooked-ingredient-block.cooked-expanded>.cooked-substitution-fields .cooked-ingredient-measurement{width:100%;display:block}#cooked-ingredients-builder .cooked-ingredient-block.cooked-expanded>.cooked-substitution-fields .cooked-ingredient-name{width:auto;grid-column:1/-1;padding-top:0}#cooked-ingredients-builder .cooked-ingredient-block.cooked-expanded>.cooked-substitution-fields .cooked-sub-label{grid-column:1/-1}#cooked-ingredients-builder .cooked-ingredient-block{position:relative}#cooked-ingredients-builder .cooked-ingredient-block .cooked-show-substitution{top:60px;right:42px}#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{right:42px}#cooked-ingredients-builder .cooked-ingredient-block .cooked-delete-ingredient{right:11px}}@media screen and (max-width:500px){#cooked_recipe_settings .cooked-clearfix:has(>.cooked-setting-column-14){grid-template-columns:1fr}}#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}#cooked_allergens .cooked-allergens-checkboxes{display:flex;flex-direction:column;gap:8px}#cooked_allergens .cooked-allergen-checkbox{display:flex;align-items:center;gap:8px;cursor:pointer}#cooked_allergens .cooked-allergen-checkbox input[type=checkbox]{margin:0}#cooked_allergens .cooked-allergen{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0}#cooked_allergens .cooked-allergen .cooked-icon{font-size:1.5rem;line-height:1}#cooked_allergens .cooked-allergen,#cooked_allergens .cooked-allergen .cooked-icon{color:rgba(0,0,0,.4)}#cooked_allergens .cooked-allergen-label{font-size:13px;color:#333} \ No newline at end of file diff --git a/assets/admin/js/cooked-functions.js b/assets/admin/js/cooked-functions.js index c3351f9..b1e1558 100644 --- a/assets/admin/js/cooked-functions.js +++ b/assets/admin/js/cooked-functions.js @@ -364,7 +364,6 @@ var cookedSortableTouchHandler = function(event) { $_CookedRecipeTab.on('click', function(e) { e.preventDefault(); $_CookedRecipeTab.removeClass('active'); - window.scrollTo(0, 0); var thisTab = $(this), thisTabID = thisTab.attr('id').split('cooked-recipe-tab-')[1]; @@ -1304,7 +1303,7 @@ function cooked_init_bulk_add($) { for (var i = 0; i < lines.length; i++) { var $row = $('
'); var $cb = $(''); - var $text = $(''); + var $text = $('').val(lines[i]); $row.append($cb).append($text); $previewList.append($row); } @@ -1342,9 +1341,9 @@ function cooked_init_bulk_add($) { 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 = $(''); + var $amt = $('').val(p.amount); + var $unit = $('').val(p.measurement); + var $name = $('').val(p.name); $row.append($cb).append($headingWrap).append($amt).append($unit).append($name); $previewList.append($row); } diff --git a/assets/admin/js/cooked-functions.min.js b/assets/admin/js/cooked-functions.min.js index c0791ab..4c73128 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=((g=>{g(document).ready(function(){var c,o,t,e,i,n,d,a,r,s,l,u=g(".cooked-color-field"),k=g("#cooked_recipe_settings").find("select"),p=g("#cooked-recipe-tabs"),_=(g("#cooked-settings-wrap"),g("#cooked_recipe_settings")),m=_.find("input#submit");$_CookedTooltips=g(".cooked-tooltip"),$_CookedConditionals=g(".cooked-conditional-hidden"),$_CookedSortable=g(".cooked-sortable"),$_CookedRecipeSaveDefault=g(".cooked-layout-save-default"),$_CookedShortcodeField=g(".cooked-shortcode-field"),$_CookedIngredientBuilder=g("#cooked-ingredients-builder"),$_CookedAutoNutritionButton=g(".cooked-auto-nutrition-button"),$_CookedDirectionBuilder=g("#cooked-directions-builder"),$_CookedRecipeGallery=g("#cooked-recipe-image-gallery"),$_CookedNutritionFactsTab=g("#cooked-recipe-tab-content-nutrition"),$_CookedSettingsPanel=g("#cooked-settings-panel"),$_CookedSettingsTabs=g("#cooked-settings-tabs"),u.length&&u.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){g(".cooked-save-default-all").on("click",function(e){e.preventDefault();var t,o=g(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=g("#_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"),g.post(cooked_admin_functions_js_vars.ajax_url,{action:"cooked_save_default",default_content:t,nonce:e},function(){g.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){g(this).select()}),$_CookedConditionals.length&&(c=[],$_CookedConditionals.each(function(){var e=g(this),t=g(this).data("condition"),o=g(this).data("value"),i=g("#"+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],g(".cooked-settings-tab-content").hide(),g("#cooked-settings-tab-content-"+n).show(),k.on("click",function(e){g(".tab-content").hide();var t=g(this).find("a"),t=($_CookedSettingsTabs.find("li").removeClass("active"),g(this).addClass("active"),t.attr("href"));"migration"==(t=(t=t.split("#"))[1])?m.hide():m.show(),g(".cooked-settings-tab-content").hide(),g("#cooked-settings-tab-content-"+t).show(),g("#cooked-settings-panel").hasClass("stuck")?window.scrollTo(0,130):window.scrollTo(0,0)}),$_CookedSettingsPanel.on("click",".cooked-settings-image-remove",function(e){e.preventDefault();e=g(this).closest(".cooked-settings-image-field");e.removeClass("cooked-has-image"),e.find(".cooked-settings-image-preview-img").attr("src","").removeAttr("srcset").removeAttr("sizes"),e.find(".cooked-settings-image-input").val("0"),e.find(".cooked-settings-image-button").val(cooked_admin_functions_js_vars.i18n_image_title)}),$_CookedSettingsPanel.on("click",".cooked-settings-image-button",function(e){e.preventDefault();var o=g(this),i=o.closest(".cooked-settings-image-field");d&&d.off("select"),(d=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(),t=(e.sizes&&e.sizes.thumbnail?e.sizes.thumbnail:e).url;i.addClass("cooked-has-image"),i.find(".cooked-settings-image-preview-img").attr("src",t).removeAttr("srcset").removeAttr("sizes"),i.find(".cooked-settings-image-input").val(e.id),o.val(cooked_admin_functions_js_vars.i18n_image_change)}),d.open()})),$_CookedIngredientBuilder.length&&(cooked_reset_ingredient_builder(),$_CookedIngredientBuilder.on("keydown",'input[data-ingredient-part="name"]',function(e){9!==e.keyCode&&13!==e.keyCode||g(this).parents(".cooked-ingredient-block").is(":last-child")&&(e.preventDefault(),g("#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=g(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=g(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(""!=g(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=g(this).val(),o=g(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(),g(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=g(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=g(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=g(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()}),$_CookedDirectionBuilder.parent().on("click",".remove-video-button",function(e){e.preventDefault();e=g(this).parent();e.removeClass("cooked-has-video"),e.find(".cooked-direction-video-preview").attr("src",""),e.find('input[data-direction-part="video"]').val(""),e.find(".direction-video-button").prop("value",cooked_admin_functions_js_vars.i18n_video_title),cooked_reset_direction_builder()}),g("body").on("click",".cooked-direction-img-placeholder, .cooked-direction-img",function(e){e.preventDefault(),g(this).parent().find(".direction-image-button").trigger("click")}),g("body").on("click",".direction-image-button",function(e){var t=g(this);s=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();g("#direction-"+s+"-image-src").attr("src",e.sizes.thumbnail.url).removeAttr("srcset").removeAttr("sizes").parent().addClass("cooked-has-image"),g('input[name="_recipe_settings[directions]['+s+'][image]"]').val(e.id),g('.direction-image-button[data-id="'+s+'"]').prop("value",cooked_admin_functions_js_vars.i18n_image_change)}),a.open()}),g("body").on("click",".cooked-direction-video-placeholder, .cooked-direction-video-preview",function(e){e.preventDefault(),g(this).parent().find(".direction-video-button").trigger("click")}),g("body").on("click",".direction-video-button",function(e){var t=g(this);s=t.data("id"),e.preventDefault(),r||(r=wp.media.frames.direction_video_frame=wp.media({title:cooked_admin_functions_js_vars.i18n_video_title,button:{text:cooked_admin_functions_js_vars.i18n_video_button},library:{type:"video"}})).on("select",function(){var e=r.state().get("selection").first().toJSON(),t=g('.direction-video-button[data-id="'+s+'"]').closest(".cooked-direction-video");t.find(".cooked-direction-video-preview").attr("src",e.url),t.find('input[data-direction-part="video"]').val(e.id),t.addClass("cooked-has-video"),g('.direction-video-button[data-id="'+s+'"]').prop("value",cooked_admin_functions_js_vars.i18n_video_change)}),r.open()})),cooked_init_bulk_add(g),$_CookedRecipeGallery.length&&(cooked_init_gallery_sorting(),g("body").on("click",".cooked-gallery-add-button",function(e){g(this);e.preventDefault(),l||(l=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=l.state().get("selection").toJSON();for(e in i)i.hasOwnProperty(e)&&(o=(t=i[e]).sizes.thumbnail.url,g("#cooked-recipe-image-gallery").append(''));cooked_init_gallery_sorting()}),l.open()}),g("body").on("click",".cooked-recipe-gallery-item img",function(e){e.preventDefault(),g(this).parent().find(".cooked-gallery-edit-button").trigger("click")}),g("body").on("click",".cooked-gallery-edit-button",function(e){var n=g(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=g(this);s=t.data("id"),e.preventDefault(),s?(g("#direction-"+s+"-image-src").parent().removeClass("cooked-has-image").prop("src",!1),g('input[name="_recipe_settings[directions]['+s+'][image]"]').val(""),g('.direction-image-button[data-id="'+s+'"]').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)})),g("#cooked-prep-time").length&&g("#cooked-prep-time,#cooked-cook-time").on("change",function(){cooked_updateTotalTimeValue(parseInt(g("#cooked-prep-time").val()),parseInt(g("#cooked-cook-time").val()))})})})(jQuery),0),cooked_bulk_per_page=20;function cooked_set_default_template(o,i,n,d,a){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%"}),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+"%"}),s.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%"}),s.text(i+" / "+i),c.removeClass("cooked-active"),s.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 h(e,t){if(u.empty(),e.length){l.attr("data-bulk-type","ingredients"),l.show(),k.removeAttr("disabled"),u.find(".cooked-bulk-add-preview-header").length||u.prepend('
'+f(_.i18n_bulk_add_amount)+''+f(_.i18n_bulk_add_unit)+''+f(_.i18n_bulk_add_name)+"
");for(var o=0;o'),d=s('"),a=s('
'),c=s('').text(_.i18n_bulk_add_heading_line_label),r=s('').val(e[o]),c=(a.append(c).append(r),s('')),r=s(''),i=s('');n.append(d).append(a).append(c).append(r).append(i),u.append(n)}}else l.attr("data-bulk-type",""),l.hide(),k.attr("disabled","disabled")}i.length&&(t=s("#cooked-bulk-add-textarea"),l=s("#cooked-bulk-add-preview"),u=s("#cooked-bulk-add-preview-list"),o=s("#cooked-bulk-add-title"),r=s("#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=s('"),c=s('');d.append(a).append(c),u.append(d)}}else l.attr("data-bulk-type",""),l.hide(),k.attr("disabled","disabled")}else t!==g&&(g=t,h(o,null),m&&clearTimeout(m),m=setTimeout(function(){var t;(t=o).length?(p.show().css("visibility","visible"),s.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;h(t,e)}).fail(function(){p.hide(),h(t,null)})):h([],null)},400))}),s(document).on("click",".cooked-bulk-add-button",function(e){e.preventDefault();var e=s(this).data("type");e=e,r.val(e),t.val(""),u.empty(),l.attr("data-bulk-type",""),l.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){s(e.target).is(i)&&n()}),s(document).on("keydown",function(e){"Escape"===e.key&&i.is(":visible")&&n()}),u.on("change",'input[type="checkbox"]',function(){var e=s(this).closest(".cooked-bulk-add-preview-row"),t=s(this).is(":checked");e.toggleClass("cooked-bulk-add-is-heading",t)}),k.on("click",function(e){var i;e.preventDefault(),s(this).attr("disabled")||(e=r.val(),i=[],"ingredients"===e?u.find(".cooked-bulk-add-preview-row").each(function(){var e=s(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=s(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{g(document).ready(function(){var c,o,t,e,i,n,d,a,r,s,l,u=g(".cooked-color-field"),k=g("#cooked_recipe_settings").find("select"),p=g("#cooked-recipe-tabs"),_=(g("#cooked-settings-wrap"),g("#cooked_recipe_settings")),m=_.find("input#submit");$_CookedTooltips=g(".cooked-tooltip"),$_CookedConditionals=g(".cooked-conditional-hidden"),$_CookedSortable=g(".cooked-sortable"),$_CookedRecipeSaveDefault=g(".cooked-layout-save-default"),$_CookedShortcodeField=g(".cooked-shortcode-field"),$_CookedIngredientBuilder=g("#cooked-ingredients-builder"),$_CookedAutoNutritionButton=g(".cooked-auto-nutrition-button"),$_CookedDirectionBuilder=g("#cooked-directions-builder"),$_CookedRecipeGallery=g("#cooked-recipe-image-gallery"),$_CookedNutritionFactsTab=g("#cooked-recipe-tab-content-nutrition"),$_CookedSettingsPanel=g("#cooked-settings-panel"),$_CookedSettingsTabs=g("#cooked-settings-tabs"),u.length&&u.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){g(".cooked-save-default-all").on("click",function(e){e.preventDefault();var t,o=g(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=g("#_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"),g.post(cooked_admin_functions_js_vars.ajax_url,{action:"cooked_save_default",default_content:t,nonce:e},function(){g.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){g(this).select()}),$_CookedConditionals.length&&(c=[],$_CookedConditionals.each(function(){var e=g(this),t=g(this).data("condition"),o=g(this).data("value"),i=g("#"+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],g(".cooked-settings-tab-content").hide(),g("#cooked-settings-tab-content-"+n).show(),k.on("click",function(e){g(".tab-content").hide();var t=g(this).find("a"),t=($_CookedSettingsTabs.find("li").removeClass("active"),g(this).addClass("active"),t.attr("href"));"migration"==(t=(t=t.split("#"))[1])?m.hide():m.show(),g(".cooked-settings-tab-content").hide(),g("#cooked-settings-tab-content-"+t).show(),g("#cooked-settings-panel").hasClass("stuck")?window.scrollTo(0,130):window.scrollTo(0,0)}),$_CookedSettingsPanel.on("click",".cooked-settings-image-remove",function(e){e.preventDefault();e=g(this).closest(".cooked-settings-image-field");e.removeClass("cooked-has-image"),e.find(".cooked-settings-image-preview-img").attr("src","").removeAttr("srcset").removeAttr("sizes"),e.find(".cooked-settings-image-input").val("0"),e.find(".cooked-settings-image-button").val(cooked_admin_functions_js_vars.i18n_image_title)}),$_CookedSettingsPanel.on("click",".cooked-settings-image-button",function(e){e.preventDefault();var o=g(this),i=o.closest(".cooked-settings-image-field");d&&d.off("select"),(d=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(),t=(e.sizes&&e.sizes.thumbnail?e.sizes.thumbnail:e).url;i.addClass("cooked-has-image"),i.find(".cooked-settings-image-preview-img").attr("src",t).removeAttr("srcset").removeAttr("sizes"),i.find(".cooked-settings-image-input").val(e.id),o.val(cooked_admin_functions_js_vars.i18n_image_change)}),d.open()})),$_CookedIngredientBuilder.length&&(cooked_reset_ingredient_builder(),$_CookedIngredientBuilder.on("keydown",'input[data-ingredient-part="name"]',function(e){9!==e.keyCode&&13!==e.keyCode||g(this).parents(".cooked-ingredient-block").is(":last-child")&&(e.preventDefault(),g("#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=g(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=g(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(""!=g(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=g(this).val(),o=g(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(),g(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=g(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=g(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=g(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()}),$_CookedDirectionBuilder.parent().on("click",".remove-video-button",function(e){e.preventDefault();e=g(this).parent();e.removeClass("cooked-has-video"),e.find(".cooked-direction-video-preview").attr("src",""),e.find('input[data-direction-part="video"]').val(""),e.find(".direction-video-button").prop("value",cooked_admin_functions_js_vars.i18n_video_title),cooked_reset_direction_builder()}),g("body").on("click",".cooked-direction-img-placeholder, .cooked-direction-img",function(e){e.preventDefault(),g(this).parent().find(".direction-image-button").trigger("click")}),g("body").on("click",".direction-image-button",function(e){var t=g(this);s=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();g("#direction-"+s+"-image-src").attr("src",e.sizes.thumbnail.url).removeAttr("srcset").removeAttr("sizes").parent().addClass("cooked-has-image"),g('input[name="_recipe_settings[directions]['+s+'][image]"]').val(e.id),g('.direction-image-button[data-id="'+s+'"]').prop("value",cooked_admin_functions_js_vars.i18n_image_change)}),a.open()}),g("body").on("click",".cooked-direction-video-placeholder, .cooked-direction-video-preview",function(e){e.preventDefault(),g(this).parent().find(".direction-video-button").trigger("click")}),g("body").on("click",".direction-video-button",function(e){var t=g(this);s=t.data("id"),e.preventDefault(),r||(r=wp.media.frames.direction_video_frame=wp.media({title:cooked_admin_functions_js_vars.i18n_video_title,button:{text:cooked_admin_functions_js_vars.i18n_video_button},library:{type:"video"}})).on("select",function(){var e=r.state().get("selection").first().toJSON(),t=g('.direction-video-button[data-id="'+s+'"]').closest(".cooked-direction-video");t.find(".cooked-direction-video-preview").attr("src",e.url),t.find('input[data-direction-part="video"]').val(e.id),t.addClass("cooked-has-video"),g('.direction-video-button[data-id="'+s+'"]').prop("value",cooked_admin_functions_js_vars.i18n_video_change)}),r.open()})),cooked_init_bulk_add(g),$_CookedRecipeGallery.length&&(cooked_init_gallery_sorting(),g("body").on("click",".cooked-gallery-add-button",function(e){g(this);e.preventDefault(),l||(l=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=l.state().get("selection").toJSON();for(e in i)i.hasOwnProperty(e)&&(o=(t=i[e]).sizes.thumbnail.url,g("#cooked-recipe-image-gallery").append(''));cooked_init_gallery_sorting()}),l.open()}),g("body").on("click",".cooked-recipe-gallery-item img",function(e){e.preventDefault(),g(this).parent().find(".cooked-gallery-edit-button").trigger("click")}),g("body").on("click",".cooked-gallery-edit-button",function(e){var n=g(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=g(this);s=t.data("id"),e.preventDefault(),s?(g("#direction-"+s+"-image-src").parent().removeClass("cooked-has-image").prop("src",!1),g('input[name="_recipe_settings[directions]['+s+'][image]"]').val(""),g('.direction-image-button[data-id="'+s+'"]').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)})),g("#cooked-prep-time").length&&g("#cooked-prep-time,#cooked-cook-time").on("change",function(){cooked_updateTotalTimeValue(parseInt(g("#cooked-prep-time").val()),parseInt(g("#cooked-cook-time").val()))})})})(jQuery),0),cooked_bulk_per_page=20;function cooked_set_default_template(o,i,n,d,a){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%"}),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+"%"}),s.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%"}),s.text(i+" / "+i),c.removeClass("cooked-active"),s.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 h(e,t){if(u.empty(),e.length){l.attr("data-bulk-type","ingredients"),l.show(),k.removeAttr("disabled"),u.find(".cooked-bulk-add-preview-header").length||u.prepend('
'+f(_.i18n_bulk_add_amount)+''+f(_.i18n_bulk_add_unit)+''+f(_.i18n_bulk_add_name)+"
");for(var o=0;o'),d=s('"),a=s('
'),c=s('').text(_.i18n_bulk_add_heading_line_label),r=s('').val(e[o]),c=(a.append(c).append(r),s('').val(i.amount)),r=s('').val(i.measurement),i=s('').val(i.name);n.append(d).append(a).append(c).append(r).append(i),u.append(n)}}else l.attr("data-bulk-type",""),l.hide(),k.attr("disabled","disabled")}i.length&&(t=s("#cooked-bulk-add-textarea"),l=s("#cooked-bulk-add-preview"),u=s("#cooked-bulk-add-preview-list"),o=s("#cooked-bulk-add-title"),r=s("#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=s('"),c=s('').val(i[n]);d.append(a).append(c),u.append(d)}}else l.attr("data-bulk-type",""),l.hide(),k.attr("disabled","disabled")}else t!==g&&(g=t,h(o,null),m&&clearTimeout(m),m=setTimeout(function(){var t;(t=o).length?(p.show().css("visibility","visible"),s.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;h(t,e)}).fail(function(){p.hide(),h(t,null)})):h([],null)},400))}),s(document).on("click",".cooked-bulk-add-button",function(e){e.preventDefault();var e=s(this).data("type");e=e,r.val(e),t.val(""),u.empty(),l.attr("data-bulk-type",""),l.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){s(e.target).is(i)&&n()}),s(document).on("keydown",function(e){"Escape"===e.key&&i.is(":visible")&&n()}),u.on("change",'input[type="checkbox"]',function(){var e=s(this).closest(".cooked-bulk-add-preview-row"),t=s(this).is(":checked");e.toggleClass("cooked-bulk-add-is-heading",t)}),k.on("click",function(e){var i;e.preventDefault(),s(this).attr("disabled")||(e=r.val(),i=[],"ingredients"===e?u.find(".cooked-bulk-add-preview-row").each(function(){var e=s(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=s(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{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 +(c=>{c(document).ready(function(){var o=c("#cooked-migration-button"),e=c("#cooked-import-button"),i=c("#cooked-csv-import-button"),s=(c("#cooked-csv-import-form"),c("#cooked-migration-progress"),c("#cooked-migration-progress-text"),c("#cooked-csv-import-progress")),a=c("#cooked-csv-import-progress-text");o.length&&o.on("click",function(o){o.preventDefault();o=c(this);confirm(cooked_migration_js_vars.i18n_confirm_migrate_recipes)&&!o.hasClass("disabled")&&(o.addClass("disabled").attr("disabled",!0),o.hide(),c.post(cooked_migration_js_vars.ajax_url,{action:"cooked_get_migrate_ids",nonce:cooked_migration_js_vars.cooked_migrate_nonce},function(o){var e;o&&(e=JSON.parse(o),0<(e=Object.keys(e).length))&&cooked_migrate_recipes(o,e)}))}),e.length&&e.on("click",function(o){o.preventDefault();var i=c(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(),c.post(cooked_migration_js_vars.ajax_url,{action:"cooked_get_import_ids",import_type:t,nonce:cooked_migration_js_vars.cooked_import_recipes_nonce},function(o){var e;o?(e=JSON.parse(o),0<(e=Object.keys(e).length)&&cooked_import_recipes(o,e,t)):(console.log(cooked_migration_js_vars.i18n_something_wrong),i.addClass("disabled").attr("disabled",!1),i.show())}))}),i.length&&i.on("click",function(o){o.preventDefault();var e,i=c(this),t=c("#cooked-csv-file"),o=t[0].files[0],r=c("#cooked-csv-import-errors");r.hide().empty(),o?"text/csv"===o.type||o.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),(e=new FormData).append("action","cooked_upload_csv"),e.append("nonce",cooked_migration_js_vars.cooked_import_nonce),e.append("csv_file",o),s.hasClass("cooked-active")||(s.addClass("cooked-active"),a.addClass("cooked-active"),s.find(".cooked-progress-bar").css({width:"0%"}),a.text(cooked_migration_js_vars.i18n_uploading)),c.ajax({url:cooked_migration_js_vars.ajax_url,type:"POST",data:e,processData:!1,contentType:!1,success:function(o){o.success?(a.text(cooked_migration_js_vars.i18n_processing),s.find(".cooked-progress-bar").css({width:"50%"}),c.post(cooked_migration_js_vars.ajax_url,{action:"cooked_process_csv",transient_key:o.data.transient_key,nonce:cooked_migration_js_vars.cooked_import_nonce},function(o){var e;o.success?(s.find(".cooked-progress-bar").css({width:"100%"}),a.text(o.data.success+" / "+o.data.total+" "+cooked_migration_js_vars.i18n_recipes_imported),o.data.errors&&0"+cooked_migration_js_vars.i18n_errors+"

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

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

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

"+cooked_migration_js_vars.i18n_failed_process_csv+"

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

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

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

"+cooked_migration_js_vars.i18n_failed_upload_csv+"

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

"+cooked_migration_js_vars.i18n_csv_invalid_file+"

").show():r.html("

"+cooked_migration_js_vars.i18n_csv_no_file+"

").show()})})})(jQuery);{function cookedDecimalAdjust(o,e,i){return void 0===i||0==+i?Math[o](e):(i=+i,null===(e=+e)||isNaN(e)||"number"!=typeof i||i%1!=0?NaN:e<0?-cookedDecimalAdjust(o,-e,i):(e=e.toString().split("e"),+((e=(e=Math[o](+(e[0]+"e"+(e[1]?+e[1]-i:-i)))).toString().split("e"))[0]+"e"+(e[1]?+e[1]+i:i))))}}Math.round10||(Math.round10=function(o,e){return cookedDecimalAdjust("round",o,e)});var cooked_recipe_migrate_counter=0,progressIterations=0;function cooked_migrate_recipes(o,s){var a,c,n,e,d=0;0"+t+" "+cooked_migration_js_vars.i18n_hrs+", "+r+" "+cooked_migration_js_vars.i18n_mins+" "+cooked_migration_js_vars.i18n_remaining+""):1<=r?n.html(i+" / "+e+""+r+" "+cooked_migration_js_vars.i18n_mins+" "+cooked_migration_js_vars.i18n_remaining+""):n.text(i+" / "+e)):n.text(i+" / "+e),cooked_migrate_recipes(o,s)):(a.hide(),n.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(o,s,a){var c,n,d,e,_=0;0"+t+" "+cooked_migration_js_vars.i18n_hrs+", "+r+" "+cooked_migration_js_vars.i18n_mins+" "+cooked_migration_js_vars.i18n_remaining+""):1<=r?d.html(i+" / "+e+""+r+" "+cooked_migration_js_vars.i18n_mins+" "+cooked_migration_js_vars.i18n_remaining+""):d.text(i+" / "+e)):d.text(i+" / "+e),cooked_import_recipes(o,s,a)):(c.hide(),d.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 diff --git a/assets/css/colors.php b/assets/css/colors.php index 3ca30bb..f74893e 100644 --- a/assets/css/colors.php +++ b/assets/css/colors.php @@ -29,50 +29,53 @@ }; ?>/* Dark Mode */ - { background:rgba(255,255,255,0.075); box-shadow:inset 0 0 0 1px rgba(255,255,255,0.05); } - { background:rgba(255,255,255,0.10); box-shadow:inset 0 0 0 1px rgba(255,255,255,0.05); } - { background:rgba(0,0,0,0.95); box-shadow:none; border-radius:5px; } - { background:rgba(0,0,0,0.25); border-color:rgba(255,255,255,0.15); } - { background:rgba(255,255,255,0.10); } - { background:rgba(255,255,255,0.15); } - select' ); ?> { border-color:rgba(0,0,0,0.15); } - select > option' ); ?> { color:#333; } - span.cooked-tax-column-title' ); ?> { border-bottom-color:rgba(255,255,255,0.15); } - { color:rgba(255,255,255,0.5); } - { color:#fff; } - { background:rgba(0,0,0,0.25); box-shadow:none !important } - span' ); ?> { color:rgba(255,255,255,0.5); } - a, .cooked-recipe-info span.cooked-fsm-button' ); ?> { color:rgba(255,255,255,0.5); } - a:hover, .cooked-recipe-info span.cooked-fsm-button:hover' ); ?> { color:#fff; } - { color:#fff; opacity:0.5; } - { border-color:rgba(255,255,255,0.25); } - { border-color:rgba(255,255,255,0.25); } - { border-color:rgba(255,255,255,0.25); color:#fff; } - { border-color:rgba(255,255,255,0.5); } - { background:rgba(0,0,0,0.25); border:none; border-radius:5px; } - { color:#fff; } - { border-color:rgba(255,255,255,0.15); } - { background:rgba(255,255,255,0.15); } - { border-color:rgba(255,255,255,0.15); } - { background:rgba(0,0,0,0.25); box-shadow:none !important; } - { box-shadow:none !important; } - { background:rgba(255,255,255,0.25); } - { background:rgba(255,255,255,0.15); } - { background:#000; color:#fff; } - { background:rgba(255,255,255,0.1); } - .cooked-rating-star.cooked-rating-star-empty, .cooked-recipe .cooked-ratable .cooked-rating-stars.cooked-user-rated > .cooked-rating-star.cooked-rating-star-empty' ); ?> { color:rgba(255,255,255,0.25); } - { color:rgba(255,255,255,0.5); } - { color:#fff; } - { background:#191919; color:#fff; box-shadow:0 -5px 30px rgba(0,0,0,0.4); } - { color:rgba(255,255,255,0.35); } - { color:rgba(255,255,255,0.65); } - { background:rgba(255,255,255,0.05); } - { color:rgba(255,255,255,0.5); } - { background:rgba(255,255,255,0.15); } + { background:rgba(255,255,255,0.075); box-shadow:inset 0 0 0 1px rgba(255,255,255,0.05); } + { background:rgba(255,255,255,0.10); box-shadow:inset 0 0 0 1px rgba(255,255,255,0.05); } + { background:rgba(0,0,0,0.95); box-shadow:none; border-radius:5px; } + { background:rgba(0,0,0,0.25); border-color:rgba(255,255,255,0.15); } + { background:rgba(255,255,255,0.10); } + { background:rgba(255,255,255,0.15); } + > select { border-color:rgba(0,0,0,0.15); } + > select > option { color:#333; } + > span.cooked-tax-column-title { border-bottom-color:rgba(255,255,255,0.15); } + { color:rgba(255,255,255,0.5); } + { color:#fff; } + { background:rgba(0,0,0,0.25); box-shadow:none !important } + > span { color:rgba(255,255,255,0.5); } + > a, + { color:rgba(255,255,255,0.5); } + > a:hover, + { color:#fff; } + { color:#fff; opacity:0.5; } + { border-color:rgba(255,255,255,0.25); } + { border-color:rgba(255,255,255,0.25); } + { border-color:rgba(255,255,255,0.25); color:#fff; } + { border-color:rgba(255,255,255,0.5); } + { background:rgba(0,0,0,0.25); border:none; border-radius:5px; } + { color:#fff; } + { border-color:rgba(255,255,255,0.15); } + { background:rgba(255,255,255,0.15); } + { border-color:rgba(255,255,255,0.15); } + { background:rgba(0,0,0,0.25); box-shadow:none !important; } + { box-shadow:none !important; } + { background:rgba(255,255,255,0.25); } + { background:rgba(255,255,255,0.15); } + { background:#000; color:#fff; } + { background:rgba(255,255,255,0.1); } + > .cooked-rating-star.cooked-rating-star-empty, + > .cooked-rating-star.cooked-rating-star-empty { color:rgba(255,255,255,0.25); } + { color:rgba(255,255,255,0.5); } + { color:#fff; } + { background:#191919; color:#fff; box-shadow:0 -5px 30px rgba(0,0,0,0.4); } + { color:rgba(255,255,255,0.35); } + { color:rgba(255,255,255,0.65); } + { background:rgba(255,255,255,0.05); } + { color:rgba(255,255,255,0.5); } + { background:rgba(255,255,255,0.15); } { background:rgba(255, 255,255,0.25); color:#fff; } +echo wp_kses( $dm( '.cooked-related-recipes-empty' ), [] ); ?> { background:rgba(255, 255,255,0.25); color:#fff; } { background:rgba(79, 79, 79, 1); color:#fff; } +echo wp_kses( $dm( '.cooked-recipe-search select.cooked-sortby-select option' ), [] ); ?> { background:rgba(79, 79, 79, 1); color:#fff; } *:not(:first-child){display:none}.fullscreen{width:100%!important;height:100%!important;max-width:100%!important;max-height:100%!important;margin:0!important;padding:0!important;overflow:hidden!important;background:#000}.fotorama--fullscreen{position:absolute!important;top:0!important;left:0!important;right:0!important;bottom:0!important;float:none!important;z-index:2147483647!important;background:#000;width:100%!important;height:100%!important;margin:0!important}.fotorama--fullscreen .fotorama__nav,.fotorama--fullscreen .fotorama__stage{background:#000}.fotorama__wrap{-webkit-text-size-adjust:100%;position:relative;direction:ltr;z-index:0}.fotorama__wrap--rtl .fotorama__stage__frame{direction:rtl}.fotorama__nav,.fotorama__stage{overflow:hidden;position:relative;max-width:100%}.fotorama__wrap--pan-y{-ms-touch-action:pan-y}.fotorama__wrap .fotorama__pointer{cursor:pointer}.fotorama__wrap--slide .fotorama__stage__frame{opacity:1!important}.fotorama__stage__frame{overflow:hidden}.fotorama__stage__frame.fotorama__active{z-index:8}.fotorama__wrap--fade .fotorama__stage__frame{display:none}.fotorama__wrap--fade .fotorama__fade-front,.fotorama__wrap--fade .fotorama__fade-rear,.fotorama__wrap--fade .fotorama__stage__frame.fotorama__active{display:block;left:0;top:0}.fotorama__wrap--fade .fotorama__fade-front{z-index:8}.fotorama__wrap--fade .fotorama__fade-rear{z-index:7}.fotorama__wrap--fade .fotorama__fade-rear.fotorama__active{z-index:9}.fotorama__wrap--fade .fotorama__stage .fotorama__shadow{display:none}.fotorama__img{-ms-filter:"alpha(Opacity=0)";filter:alpha(opacity=0);opacity:0;border:none!important}.fotorama__error .fotorama__img,.fotorama__loaded .fotorama__img{-ms-filter:"alpha(Opacity=100)";filter:alpha(opacity=100);opacity:1}.fotorama--fullscreen .fotorama__loaded--full .fotorama__img,.fotorama__img--full{display:none}.fotorama--fullscreen .fotorama__loaded--full .fotorama__img--full{display:block}.fotorama__wrap--only-active .fotorama__nav,.fotorama__wrap--only-active .fotorama__stage{max-width:99999px!important}.fotorama__wrap--only-active .fotorama__stage__frame{visibility:hidden}.fotorama__wrap--only-active .fotorama__stage__frame.fotorama__active{visibility:visible}.fotorama__nav{font-size:0;line-height:0;text-align:center;display:none;white-space:nowrap;z-index:5}.fotorama__nav__shaft{position:relative;left:0;top:0;text-align:left}.fotorama__nav__frame{position:relative;cursor:pointer}.fotorama__nav--dots{display:block}.fotorama__nav--dots .fotorama__nav__frame{width:18px;height:30px}.fotorama__nav--dots .fotorama__nav__frame--thumb,.fotorama__nav--dots .fotorama__thumb-border{display:none}.fotorama__nav--thumbs{display:block}.fotorama__nav--thumbs .fotorama__nav__frame{padding-left:0!important}.fotorama__nav--thumbs .fotorama__nav__frame:last-child{padding-right:0!important}.fotorama__nav--thumbs .fotorama__nav__frame--dot{display:none}.fotorama__dot{display:block;width:4px;height:4px;position:relative;top:12px;left:6px;border-radius:6px;border:1px solid #7f7f7f}.fotorama__nav__frame:focus .fotorama__dot:after{padding:1px;top:-1px;left:-1px}.fotorama__nav__frame.fotorama__active .fotorama__dot{width:0;height:0;border-width:3px}.fotorama__nav__frame.fotorama__active .fotorama__dot:after{padding:3px;top:-3px;left:-3px}.fotorama__thumb{overflow:hidden;position:relative;width:100%;height:100%}.fotorama__nav__frame:focus .fotorama__thumb{z-index:2}.fotorama__thumb-border{position:absolute;z-index:9;top:0;left:0;border-style:solid;border-color:#00afea;background-image:linear-gradient(to bottom right,rgba(255,255,255,.25),rgba(64,64,64,.1))}.fotorama__caption{position:absolute;z-index:12;bottom:0;left:0;right:0;font-family:'Helvetica Neue',Arial,sans-serif;font-size:14px;line-height:1.5;color:#000}.fotorama__caption a{text-decoration:none;color:#000;border-bottom:1px solid;border-color:rgba(0,0,0,.5)}.fotorama__caption a:hover{color:#333;border-color:rgba(51,51,51,.5)}.fotorama__wrap--rtl .fotorama__caption{left:auto;right:0}.fotorama__wrap--no-captions .fotorama__caption,.fotorama__wrap--video .fotorama__caption{display:none}.fotorama__caption__wrap{background-color:#fff;background-color:rgba(255,255,255,.9);padding:5px 10px}@-webkit-keyframes spinner{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes spinner{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.fotorama__wrap--css3 .fotorama__spinner{-webkit-animation:spinner 24s infinite linear;animation:spinner 24s infinite linear}.fotorama__wrap--css3 .fotorama__html,.fotorama__wrap--css3 .fotorama__stage .fotorama__img{transition-property:opacity;transition-timing-function:linear;transition-duration:.3s}.fotorama__wrap--video .fotorama__stage__frame--video .fotorama__html,.fotorama__wrap--video .fotorama__stage__frame--video .fotorama__img{-ms-filter:"alpha(Opacity=0)";filter:alpha(opacity=0);opacity:0}.fotorama__select{cursor:auto}.fotorama__video{top:32px;right:0;bottom:0;left:0;position:absolute;z-index:10}@-moz-document url-prefix(){.fotorama__active{box-shadow:0 0 0 transparent}}.fotorama__arr,.fotorama__fullscreen-icon,.fotorama__video-close,.fotorama__video-play{position:absolute;z-index:11;cursor:pointer}.fotorama__arr{position:absolute;width:32px;height:32px;top:50%;margin-top:-16px}.fotorama__arr--prev{left:2px;background-position:0 0}.fotorama__arr--next{right:2px;background-position:-32px 0}.fotorama__arr--disabled{pointer-events:none;cursor:default;*display:none;opacity:.1}.fotorama__fullscreen-icon{width:32px;height:32px;top:2px;right:2px;background-position:0 -32px;z-index:20}.fotorama__arr:focus,.fotorama__fullscreen-icon:focus{border-radius:50%}.fotorama--fullscreen .fotorama__fullscreen-icon{background-position:-32px -32px}.fotorama__video-play{width:96px;height:96px;left:50%;top:50%;margin-left:-48px;margin-top:-48px;background-position:0 -64px;opacity:0}.fotorama__wrap--css2 .fotorama__video-play,.fotorama__wrap--video .fotorama__stage .fotorama__video-play{display:none}.fotorama__error .fotorama__video-play,.fotorama__loaded .fotorama__video-play,.fotorama__nav__frame .fotorama__video-play{opacity:1;display:block}.fotorama__nav__frame .fotorama__video-play{width:32px;height:32px;margin-left:-16px;margin-top:-16px;background-position:-64px -32px}.fotorama__video-close{width:32px;height:32px;top:0;right:0;background-position:-64px 0;z-index:20;opacity:0}.fotorama__wrap--css2 .fotorama__video-close{display:none}.fotorama__wrap--css3 .fotorama__video-close{-webkit-transform:translate3d(32px,-32px,0);transform:translate3d(32px,-32px,0)}.fotorama__wrap--video .fotorama__video-close{display:block;opacity:1}.fotorama__wrap--css3.fotorama__wrap--video .fotorama__video-close{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.fotorama__wrap--no-controls.fotorama__wrap--toggle-arrows .fotorama__arr,.fotorama__wrap--no-controls.fotorama__wrap--toggle-arrows .fotorama__fullscreen-icon{opacity:0}.fotorama__wrap--no-controls.fotorama__wrap--toggle-arrows .fotorama__arr:focus,.fotorama__wrap--no-controls.fotorama__wrap--toggle-arrows .fotorama__fullscreen-icon:focus{opacity:1}.fotorama__wrap--video .fotorama__arr,.fotorama__wrap--video .fotorama__fullscreen-icon{opacity:0!important}.fotorama__wrap--css2.fotorama__wrap--no-controls.fotorama__wrap--toggle-arrows .fotorama__arr,.fotorama__wrap--css2.fotorama__wrap--no-controls.fotorama__wrap--toggle-arrows .fotorama__fullscreen-icon{display:none}.fotorama__wrap--css2.fotorama__wrap--no-controls.fotorama__wrap--toggle-arrows .fotorama__arr:focus,.fotorama__wrap--css2.fotorama__wrap--no-controls.fotorama__wrap--toggle-arrows .fotorama__fullscreen-icon:focus{display:block}.fotorama__wrap--css2.fotorama__wrap--video .fotorama__arr,.fotorama__wrap--css2.fotorama__wrap--video .fotorama__fullscreen-icon{display:none!important}.fotorama__wrap--css3.fotorama__wrap--no-controls.fotorama__wrap--slide.fotorama__wrap--toggle-arrows .fotorama__fullscreen-icon:not(:focus){-webkit-transform:translate3d(32px,-32px,0);transform:translate3d(32px,-32px,0)}.fotorama__wrap--css3.fotorama__wrap--no-controls.fotorama__wrap--slide.fotorama__wrap--toggle-arrows .fotorama__arr--prev:not(:focus){-webkit-transform:translate3d(-48px,0,0);transform:translate3d(-48px,0,0)}.fotorama__wrap--css3.fotorama__wrap--no-controls.fotorama__wrap--slide.fotorama__wrap--toggle-arrows .fotorama__arr--next:not(:focus){-webkit-transform:translate3d(48px,0,0);transform:translate3d(48px,0,0)}.fotorama__wrap--css3.fotorama__wrap--video .fotorama__fullscreen-icon{-webkit-transform:translate3d(32px,-32px,0)!important;transform:translate3d(32px,-32px,0)!important}.fotorama__wrap--css3.fotorama__wrap--video .fotorama__arr--prev{-webkit-transform:translate3d(-48px,0,0)!important;transform:translate3d(-48px,0,0)!important}.fotorama__wrap--css3.fotorama__wrap--video .fotorama__arr--next{-webkit-transform:translate3d(48px,0,0)!important;transform:translate3d(48px,0,0)!important}.fotorama__wrap--css3 .fotorama__arr:not(:focus),.fotorama__wrap--css3 .fotorama__fullscreen-icon:not(:focus),.fotorama__wrap--css3 .fotorama__video-close:not(:focus),.fotorama__wrap--css3 .fotorama__video-play:not(:focus){transition-property:-webkit-transform,opacity;transition-property:transform,opacity;transition-duration:.3s}.fotorama__nav:after,.fotorama__nav:before,.fotorama__stage:after,.fotorama__stage:before{content:"";display:block;position:absolute;text-decoration:none;top:0;bottom:0;width:10px;height:auto;z-index:10;pointer-events:none;background-repeat:no-repeat;background-size:1px 100%,5px 100%}.fotorama__nav:before,.fotorama__stage:before{background-image:linear-gradient(transparent,rgba(0,0,0,.2) 25%,rgba(0,0,0,.3) 75%,transparent),radial-gradient(farthest-side at 0 50%,rgba(0,0,0,.4),transparent);background-position:0 0,0 0;left:-10px}.fotorama__nav.fotorama__shadows--left:before,.fotorama__stage.fotorama__shadows--left:before{left:0}.fotorama__nav:after,.fotorama__stage:after{background-image:linear-gradient(transparent,rgba(0,0,0,.2) 25%,rgba(0,0,0,.3) 75%,transparent),radial-gradient(farthest-side at 100% 50%,rgba(0,0,0,.4),transparent);background-position:100% 0,100% 0;right:-10px}.fotorama__nav.fotorama__shadows--right:after,.fotorama__stage.fotorama__shadows--right:after{right:0}.fotorama--fullscreen .fotorama__nav:after,.fotorama--fullscreen .fotorama__nav:before,.fotorama--fullscreen .fotorama__stage:after,.fotorama--fullscreen .fotorama__stage:before,.fotorama__wrap--fade .fotorama__stage:after,.fotorama__wrap--fade .fotorama__stage:before,.fotorama__wrap--no-shadows .fotorama__nav:after,.fotorama__wrap--no-shadows .fotorama__nav:before,.fotorama__wrap--no-shadows .fotorama__stage:after,.fotorama__wrap--no-shadows .fotorama__stage:before{display:none} \ No newline at end of file +.fotorama__arr:focus:after,.fotorama__fullscreen-icon:focus:after,.fotorama__html,.fotorama__img,.fotorama__nav__frame:focus .fotorama__dot:after,.fotorama__nav__frame:focus .fotorama__thumb:after,.fotorama__stage__frame,.fotorama__stage__shaft,.fotorama__video iframe{position:absolute;width:100%;height:100%;top:0;right:0;left:0;bottom:0}.fotorama--fullscreen,.fotorama__img{max-width:99999px!important;max-height:99999px!important;min-width:0!important;min-height:0!important;border-radius:0!important;box-shadow:none!important;padding:0!important}.fotorama__wrap .fotorama__grab{cursor:move;cursor:-webkit-grab;cursor:-o-grab;cursor:-ms-grab;cursor:grab}.fotorama__grabbing *{cursor:move;cursor:-webkit-grabbing;cursor:-o-grabbing;cursor:-ms-grabbing;cursor:grabbing}.fotorama__spinner{position:absolute!important;top:50%!important;left:50%!important}.fotorama__wrap--css3 .fotorama__arr,.fotorama__wrap--css3 .fotorama__fullscreen-icon,.fotorama__wrap--css3 .fotorama__nav__shaft,.fotorama__wrap--css3 .fotorama__stage__shaft,.fotorama__wrap--css3 .fotorama__thumb-border,.fotorama__wrap--css3 .fotorama__video-close,.fotorama__wrap--css3 .fotorama__video-play{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.fotorama__caption,.fotorama__nav:after,.fotorama__nav:before,.fotorama__stage:after,.fotorama__stage:before,.fotorama__wrap--css3 .fotorama__html,.fotorama__wrap--css3 .fotorama__nav,.fotorama__wrap--css3 .fotorama__spinner,.fotorama__wrap--css3 .fotorama__stage,.fotorama__wrap--css3 .fotorama__stage .fotorama__img,.fotorama__wrap--css3 .fotorama__stage__frame{-webkit-transform:translateZ(0);transform:translateZ(0)}.fotorama__arr:focus,.fotorama__fullscreen-icon:focus,.fotorama__nav__frame{outline:0}.fotorama__arr:focus:after,.fotorama__fullscreen-icon:focus:after,.fotorama__nav__frame:focus .fotorama__dot:after,.fotorama__nav__frame:focus .fotorama__thumb:after{content:'';border-radius:inherit;background-color:rgba(0,175,234,.5)}.fotorama__wrap--video .fotorama__stage,.fotorama__wrap--video .fotorama__stage__frame--video,.fotorama__wrap--video .fotorama__stage__frame--video .fotorama__html,.fotorama__wrap--video .fotorama__stage__frame--video .fotorama__img,.fotorama__wrap--video .fotorama__stage__shaft{-webkit-transform:none!important;transform:none!important}.fotorama__wrap--css3 .fotorama__nav__shaft,.fotorama__wrap--css3 .fotorama__stage__shaft,.fotorama__wrap--css3 .fotorama__thumb-border{transition-property:-webkit-transform,width;transition-property:transform,width;transition-timing-function:cubic-bezier(0.1,0,.25,1);transition-duration:0ms}.fotorama__arr,.fotorama__fullscreen-icon,.fotorama__no-select,.fotorama__video-close,.fotorama__video-play,.fotorama__wrap{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.fotorama__select{-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}.fotorama__nav,.fotorama__nav__frame{margin:auto;padding:0}.fotorama__caption__wrap,.fotorama__nav__frame,.fotorama__nav__shaft{-moz-box-orient:vertical;display:inline-block;vertical-align:middle;*display:inline;*zoom:1}.fotorama__nav__frame,.fotorama__thumb-border{box-sizing:content-box}.fotorama__caption__wrap{box-sizing:border-box}.fotorama--hidden,.fotorama__load{position:absolute;left:-99999px;top:-99999px;z-index:-1}.fotorama__arr,.fotorama__fullscreen-icon,.fotorama__nav,.fotorama__nav__frame,.fotorama__nav__shaft,.fotorama__stage__frame,.fotorama__stage__shaft,.fotorama__video-close,.fotorama__video-play{-webkit-tap-highlight-color:transparent}.fotorama__arr,.fotorama__fullscreen-icon,.fotorama__video-close,.fotorama__video-play{background:url(fotorama.png) no-repeat}@media (-webkit-min-device-pixel-ratio:1.5),(min-resolution:2dppx){.fotorama__arr,.fotorama__fullscreen-icon,.fotorama__video-close,.fotorama__video-play{background:url(fotorama-2x.png) 0 0/96px 160px no-repeat}}.fotorama__thumb{background-color:#7f7f7f;background-color:rgba(127,127,127,.2)}@media print{.fotorama__arr,.fotorama__fullscreen-icon,.fotorama__thumb-border,.fotorama__video-close,.fotorama__video-play{background:none!important}}.fotorama{min-width:1px;overflow:hidden}.fotorama:not(.fotorama--unobtrusive)>*:not(:first-child){display:none}.fullscreen{width:100%!important;height:100%!important;max-width:100%!important;max-height:100%!important;margin:0!important;padding:0!important;overflow:hidden!important;background:#000}.fotorama--fullscreen{position:absolute!important;top:0!important;left:0!important;right:0!important;bottom:0!important;float:none!important;z-index:2147483647!important;background:#000;width:100%!important;height:100%!important;margin:0!important}.fotorama--fullscreen .fotorama__nav,.fotorama--fullscreen .fotorama__stage{background:#000}.fotorama__wrap{-webkit-text-size-adjust:100%;position:relative;direction:ltr;z-index:0}.fotorama__wrap--rtl .fotorama__stage__frame{direction:rtl}.fotorama__nav,.fotorama__stage{overflow:hidden;position:relative;max-width:100%}.fotorama__wrap--pan-y{-ms-touch-action:pan-y}.fotorama__wrap .fotorama__pointer{cursor:pointer}.fotorama__wrap--slide .fotorama__stage__frame{opacity:1!important}.fotorama__stage__frame{overflow:hidden}.fotorama__stage__frame.fotorama__active{z-index:8}.fotorama__wrap--fade .fotorama__stage__frame{display:none}.fotorama__wrap--fade .fotorama__fade-front,.fotorama__wrap--fade .fotorama__fade-rear,.fotorama__wrap--fade .fotorama__stage__frame.fotorama__active{display:block;left:0;top:0}.fotorama__wrap--fade .fotorama__fade-front{z-index:8}.fotorama__wrap--fade .fotorama__fade-rear{z-index:7}.fotorama__wrap--fade .fotorama__fade-rear.fotorama__active{z-index:9}.fotorama__wrap--fade .fotorama__stage .fotorama__shadow{display:none}.fotorama__img{-ms-filter:"alpha(Opacity=0)";filter:alpha(opacity=0);opacity:0;border:none!important}.fotorama__error .fotorama__img,.fotorama__loaded .fotorama__img{-ms-filter:"alpha(Opacity=100)";filter:alpha(opacity=100);opacity:1}.fotorama--fullscreen .fotorama__loaded--full .fotorama__img,.fotorama__img--full{display:none}.fotorama--fullscreen .fotorama__loaded--full .fotorama__img--full{display:block}.fotorama__wrap--only-active .fotorama__nav,.fotorama__wrap--only-active .fotorama__stage{max-width:99999px!important}.fotorama__wrap--only-active .fotorama__stage__frame{visibility:hidden}.fotorama__wrap--only-active .fotorama__stage__frame.fotorama__active{visibility:visible}.fotorama__nav{font-size:0;line-height:0;text-align:center;display:none;white-space:nowrap;z-index:5}.fotorama__nav__shaft{position:relative;left:0;top:0;text-align:left}.fotorama__nav__frame{position:relative;cursor:pointer}.fotorama__nav--dots{display:block}.fotorama__nav--dots .fotorama__nav__frame{width:18px;height:30px}.fotorama__nav--dots .fotorama__nav__frame--thumb,.fotorama__nav--dots .fotorama__thumb-border{display:none}.fotorama__nav--thumbs{display:block}.fotorama__nav--thumbs .fotorama__nav__frame{padding-left:0!important}.fotorama__nav--thumbs .fotorama__nav__frame:last-child{padding-right:0!important}.fotorama__nav--thumbs .fotorama__nav__frame--dot{display:none}.fotorama__dot{display:block;width:4px;height:4px;position:relative;top:12px;left:6px;border-radius:6px;border:1px solid #7f7f7f}.fotorama__nav__frame:focus .fotorama__dot:after{padding:1px;top:-1px;left:-1px}.fotorama__nav__frame.fotorama__active .fotorama__dot{width:0;height:0;border-width:3px}.fotorama__nav__frame.fotorama__active .fotorama__dot:after{padding:3px;top:-3px;left:-3px}.fotorama__thumb{overflow:hidden;position:relative;width:100%;height:100%}.fotorama__nav__frame:focus .fotorama__thumb{z-index:2}.fotorama__thumb-border{position:absolute;z-index:9;top:0;left:0;border-style:solid;border-color:#00afea;background-image:linear-gradient(to bottom right,rgba(255,255,255,.25),rgba(64,64,64,.1))}.fotorama__caption{position:absolute;z-index:12;bottom:0;left:0;right:0;font-family:'Helvetica Neue',Arial,sans-serif;font-size:14px;line-height:1.5;color:#000}.fotorama__caption a{text-decoration:none;color:#000;border-bottom:1px solid;border-color:rgba(0,0,0,.5)}.fotorama__caption a:hover{color:#333;border-color:rgba(51,51,51,.5)}.fotorama__wrap--rtl .fotorama__caption{left:auto;right:0}.fotorama__wrap--no-captions .fotorama__caption,.fotorama__wrap--video .fotorama__caption{display:none}.fotorama__caption__wrap{background-color:#fff;background-color:rgba(255,255,255,.9);padding:5px 10px}@-webkit-keyframes spinner{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes spinner{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.fotorama__wrap--css3 .fotorama__spinner{-webkit-animation:spinner 24s infinite linear;animation:spinner 24s infinite linear}.fotorama__wrap--css3 .fotorama__html,.fotorama__wrap--css3 .fotorama__stage .fotorama__img{transition-property:opacity;transition-timing-function:linear;transition-duration:.3s}.fotorama__wrap--video .fotorama__stage__frame--video .fotorama__html,.fotorama__wrap--video .fotorama__stage__frame--video .fotorama__img{-ms-filter:"alpha(Opacity=0)";filter:alpha(opacity=0);opacity:0}.fotorama__select{cursor:auto}.fotorama__video{top:32px;right:0;bottom:0;left:0;position:absolute;z-index:10}@-moz-document url-prefix(){.fotorama__active{box-shadow:0 0 0 transparent}}.fotorama__arr,.fotorama__fullscreen-icon,.fotorama__video-close,.fotorama__video-play{position:absolute;z-index:11;cursor:pointer}.fotorama__arr{position:absolute;width:32px;height:32px;top:50%;margin-top:-16px}.fotorama__arr--prev{left:2px;background-position:0 0}.fotorama__arr--next{right:2px;background-position:-32px 0}.fotorama__arr--disabled{pointer-events:none;cursor:default;*display:none;opacity:.1}.fotorama__fullscreen-icon{width:32px;height:32px;top:2px;right:2px;background-position:0 -32px;z-index:20}.fotorama__arr:focus,.fotorama__fullscreen-icon:focus{border-radius:50%}.fotorama--fullscreen .fotorama__fullscreen-icon{background-position:-32px -32px}.fotorama__video-play{width:96px;height:96px;left:50%;top:50%;margin-left:-48px;margin-top:-48px;background-position:0 -64px;opacity:0}.fotorama__wrap--css2 .fotorama__video-play,.fotorama__wrap--video .fotorama__stage .fotorama__video-play{display:none}.fotorama__error .fotorama__video-play,.fotorama__loaded .fotorama__video-play,.fotorama__nav__frame .fotorama__video-play{opacity:1;display:block}.fotorama__nav__frame .fotorama__video-play{width:32px;height:32px;margin-left:-16px;margin-top:-16px;background-position:-64px -32px}.fotorama__video-close{width:32px;height:32px;top:0;right:0;background-position:-64px 0;z-index:20;opacity:0}.fotorama__wrap--css2 .fotorama__video-close{display:none}.fotorama__wrap--css3 .fotorama__video-close{-webkit-transform:translate3d(32px,-32px,0);transform:translate3d(32px,-32px,0)}.fotorama__wrap--video .fotorama__video-close{display:block;opacity:1}.fotorama__wrap--css3.fotorama__wrap--video .fotorama__video-close{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.fotorama__wrap--no-controls.fotorama__wrap--toggle-arrows .fotorama__arr,.fotorama__wrap--no-controls.fotorama__wrap--toggle-arrows .fotorama__fullscreen-icon{opacity:0}.fotorama__wrap--no-controls.fotorama__wrap--toggle-arrows .fotorama__arr:focus,.fotorama__wrap--no-controls.fotorama__wrap--toggle-arrows .fotorama__fullscreen-icon:focus{opacity:1}.fotorama__wrap--video .fotorama__arr,.fotorama__wrap--video .fotorama__fullscreen-icon{opacity:0!important}.fotorama__wrap--css2.fotorama__wrap--no-controls.fotorama__wrap--toggle-arrows .fotorama__arr,.fotorama__wrap--css2.fotorama__wrap--no-controls.fotorama__wrap--toggle-arrows .fotorama__fullscreen-icon{display:none}.fotorama__wrap--css2.fotorama__wrap--no-controls.fotorama__wrap--toggle-arrows .fotorama__arr:focus,.fotorama__wrap--css2.fotorama__wrap--no-controls.fotorama__wrap--toggle-arrows .fotorama__fullscreen-icon:focus{display:block}.fotorama__wrap--css2.fotorama__wrap--video .fotorama__arr,.fotorama__wrap--css2.fotorama__wrap--video .fotorama__fullscreen-icon{display:none!important}.fotorama__wrap--css3.fotorama__wrap--no-controls.fotorama__wrap--slide.fotorama__wrap--toggle-arrows .fotorama__fullscreen-icon:not(:focus){-webkit-transform:translate3d(32px,-32px,0);transform:translate3d(32px,-32px,0)}.fotorama__wrap--css3.fotorama__wrap--no-controls.fotorama__wrap--slide.fotorama__wrap--toggle-arrows .fotorama__arr--prev:not(:focus){-webkit-transform:translate3d(-48px,0,0);transform:translate3d(-48px,0,0)}.fotorama__wrap--css3.fotorama__wrap--no-controls.fotorama__wrap--slide.fotorama__wrap--toggle-arrows .fotorama__arr--next:not(:focus){-webkit-transform:translate3d(48px,0,0);transform:translate3d(48px,0,0)}.fotorama__wrap--css3.fotorama__wrap--video .fotorama__fullscreen-icon{-webkit-transform:translate3d(32px,-32px,0)!important;transform:translate3d(32px,-32px,0)!important}.fotorama__wrap--css3.fotorama__wrap--video .fotorama__arr--prev{-webkit-transform:translate3d(-48px,0,0)!important;transform:translate3d(-48px,0,0)!important}.fotorama__wrap--css3.fotorama__wrap--video .fotorama__arr--next{-webkit-transform:translate3d(48px,0,0)!important;transform:translate3d(48px,0,0)!important}.fotorama__wrap--css3 .fotorama__arr:not(:focus),.fotorama__wrap--css3 .fotorama__fullscreen-icon:not(:focus),.fotorama__wrap--css3 .fotorama__video-close:not(:focus),.fotorama__wrap--css3 .fotorama__video-play:not(:focus){transition-property:-webkit-transform,opacity;transition-property:transform,opacity;transition-duration:.3s}.fotorama__nav:after,.fotorama__nav:before,.fotorama__stage:after,.fotorama__stage:before{content:"";display:block;position:absolute;text-decoration:none;top:0;bottom:0;width:10px;height:auto;z-index:10;pointer-events:none;background-repeat:no-repeat;background-size:1px 100%,5px 100%}.fotorama__nav:before,.fotorama__stage:before{background-image:linear-gradient(transparent,rgba(0,0,0,.2) 25%,rgba(0,0,0,.3) 75%,transparent),radial-gradient(farthest-side at 0 50%,rgba(0,0,0,.4),transparent);background-position:0 0,0 0;left:-10px}.fotorama__nav.fotorama__shadows--left:before,.fotorama__stage.fotorama__shadows--left:before{left:0}.fotorama__nav:after,.fotorama__stage:after{background-image:linear-gradient(transparent,rgba(0,0,0,.2) 25%,rgba(0,0,0,.3) 75%,transparent),radial-gradient(farthest-side at 100% 50%,rgba(0,0,0,.4),transparent);background-position:100% 0,100% 0;right:-10px}.fotorama__nav.fotorama__shadows--right:after,.fotorama__stage.fotorama__shadows--right:after{right:0}.fotorama--fullscreen .fotorama__nav:after,.fotorama--fullscreen .fotorama__nav:before,.fotorama--fullscreen .fotorama__stage:after,.fotorama--fullscreen .fotorama__stage:before,.fotorama__wrap--fade .fotorama__stage:after,.fotorama__wrap--fade .fotorama__stage:before,.fotorama__wrap--no-shadows .fotorama__nav:after,.fotorama__wrap--no-shadows .fotorama__nav:before,.fotorama__wrap--no-shadows .fotorama__stage:after,.fotorama__wrap--no-shadows .fotorama__stage:before{display:none} \ No newline at end of file diff --git a/assets/css/responsive.php b/assets/css/responsive.php index a5b4487..c6ae56c 100644 --- a/assets/css/responsive.php +++ b/assets/css/responsive.php @@ -80,7 +80,7 @@ $_cooked_fsm_dark_selectors = Cooked_Settings::prefix_dark_mode_css( '.cooked-fsm .cooked-fsm-ingredients, .cooked-fsm .cooked-fsm-directions-wrap' ); - ?> { background:#000; color:#fff; } { background:#000; color:#fff; } diff --git a/bun.lock b/bun.lock index 833faa0..c228ee1 100644 --- a/bun.lock +++ b/bun.lock @@ -5,22 +5,31 @@ "": { "name": "cooked", "devDependencies": { - "@playwright/test": "^1.62.1", - "@types/node": "^26.2.0", - "@wordpress/e2e-test-utils-playwright": "^1.52.0", - "@wordpress/env": "^11.12.0", - "bestzip": "^3.0.2", + "@axe-core/playwright": "^4.13.0", + "@playwright/test": "^1.63.0", + "@types/node": "^26.4.1", + "@wordpress/e2e-test-utils-playwright": "^1.54.0", + "@wordpress/env": "^11.14.0", + "backstopjs": "^6.3.25", + "bestzip": "^3.0.3", + "dotenv": "^17.4.2", "gulp": "^5.0.1", "gulp-clean-css": "^4.3.0", "gulp-rename": "^2.1.0", "gulp-sass": "^6.0.1", "gulp-uglify": "^3.0.2", - "playwright": "^1.62.1", - "sass": "^1.102.0", + "playwright": "^1.63.0", + "sass": "^1.104.0", }, }, }, "packages": { + "@axe-core/playwright": ["@axe-core/playwright@4.13.0", "", { "dependencies": { "axe-core": "~4.13.0" }, "peerDependencies": { "playwright-core": ">= 1.0.0" } }, "sha512-6YLx+kxXu5GJceG4ozFg+33a2EMTdjYwWGloJ3sb9Kta5pp+ZNS53uxGVog5JetIY8s++P5UrtX+cri+u0VAVg=="], + + "@babel/code-frame": ["@babel/code-frame@7.29.7", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.29.7", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw=="], + + "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.29.7", "", {}, "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg=="], + "@formatjs/ecma402-abstract": ["@formatjs/ecma402-abstract@2.3.6", "", { "dependencies": { "@formatjs/fast-memoize": "2.2.7", "@formatjs/intl-localematcher": "0.6.2", "decimal.js": "^10.4.3", "tslib": "^2.8.0" } }, "sha512-HJnTFeRM2kVFVr5gr5kH1XP6K0JcJtE7Lzvtr3FS/so5f1kpsqqqxy5JF+FRaO6H2qmcMfAUIox7AJteieRtVw=="], "@formatjs/fast-memoize": ["@formatjs/fast-memoize@2.2.7", "", { "dependencies": { "tslib": "^2.8.0" } }, "sha512-Yabmi9nSvyOMrlSeGGWDiH7rf3a7sIwplbvo/dlz9WCIjzIQAfy1RMf4S0X3yG724n5Ghu2GmEl5NJIV6O9sZQ=="], @@ -73,7 +82,9 @@ "@kwsites/promise-deferred": ["@kwsites/promise-deferred@1.1.1", "", {}, "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw=="], - "@nodable/entities": ["@nodable/entities@2.1.0", "", {}, "sha512-nyT7T3nbMyBI/lvr6L5TyWbFJAI9FTgVRakNoBqCD+PmID8DzFrrNdLLtHMwMszOtqZa8PAOV24ZqDnQrhQINA=="], + "@mirzazeyrek/node-resemble-js": ["@mirzazeyrek/node-resemble-js@1.2.1", "", { "dependencies": { "jpeg-js": "^0.4.2", "pngjs": "^6.0.0" } }, "sha512-+z1c7HpC5ysdSVVyUVz67hctVLl337VlRJP/MBwpvXHkKJdlnSUVrBhlRzxgal7xpm1uDE2JeUhWbQh6wPRC4w=="], + + "@nodable/entities": ["@nodable/entities@3.0.0", "", {}, "sha512-8L9xFeTYKhm49xfIypoe2W5wV1m/3Z58kT+7kR9A8OyFxcPduI4VmxaUMQyKYrRjUoLLSXv6EKKID5Tvj9cUVw=="], "@octokit/app": ["@octokit/app@14.1.0", "", { "dependencies": { "@octokit/auth-app": "^6.0.0", "@octokit/auth-unauthenticated": "^5.0.0", "@octokit/core": "^5.0.0", "@octokit/oauth-app": "^6.0.0", "@octokit/plugin-paginate-rest": "^9.0.0", "@octokit/types": "^12.0.0", "@octokit/webhooks": "^12.0.4" } }, "sha512-g3uEsGOQCBl1+W1rgfwoRFUIR6PtvB2T1E4RpygeUU5LrLvlOqcxrt5lfykIeRpUPpupreGJUYl70fqMDXdTpw=="], @@ -185,83 +196,81 @@ "@opentelemetry/sdk-trace-base": ["@opentelemetry/sdk-trace-base@1.30.1", "", { "dependencies": { "@opentelemetry/core": "1.30.1", "@opentelemetry/resources": "1.30.1", "@opentelemetry/semantic-conventions": "1.28.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-jVPgBbH1gCy2Lb7X0AVQ8XAfgg0pJ4nvl8/IiQA6nxOsPvS+0zMJaFSs2ltXe0J6C8dqjcnpyqINDJmU30+uOg=="], - "@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.41.1", "", {}, "sha512-/UhIkaZgPutTFmQ7RnIJGgDXZmtEJ7Dvi86xNTFWcnRxVRNk/aotsqDJYeEvDP+FSMB2SdW+pQzNMcWP0rwuNA=="], + "@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.43.0", "", {}, "sha512-eSYWTm620tTk45EKSedaUL8MFYI8hW164hIXsgIHyxu3VobUB3fFCu5t0hQby6OoWRPsG1KkKUG2M5UadiLiVg=="], "@opentelemetry/sql-common": ["@opentelemetry/sql-common@0.40.1", "", { "dependencies": { "@opentelemetry/core": "^1.1.0" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0" } }, "sha512-nSDlnHSqzC3pXn/wZEZVLuAuJ1MYMXPBwtv2qAbCa3847SaHItdE7SzUq/Jtb0KZmh1zfAbNi3AAMjztTT4Ugg=="], - "@parcel/watcher": ["@parcel/watcher@2.5.6", "", { "dependencies": { "detect-libc": "^2.0.3", "is-glob": "^4.0.3", "node-addon-api": "^7.0.0", "picomatch": "^4.0.3" }, "optionalDependencies": { "@parcel/watcher-android-arm64": "2.5.6", "@parcel/watcher-darwin-arm64": "2.5.6", "@parcel/watcher-darwin-x64": "2.5.6", "@parcel/watcher-freebsd-x64": "2.5.6", "@parcel/watcher-linux-arm-glibc": "2.5.6", "@parcel/watcher-linux-arm-musl": "2.5.6", "@parcel/watcher-linux-arm64-glibc": "2.5.6", "@parcel/watcher-linux-arm64-musl": "2.5.6", "@parcel/watcher-linux-x64-glibc": "2.5.6", "@parcel/watcher-linux-x64-musl": "2.5.6", "@parcel/watcher-win32-arm64": "2.5.6", "@parcel/watcher-win32-ia32": "2.5.6", "@parcel/watcher-win32-x64": "2.5.6" } }, "sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ=="], - - "@parcel/watcher-android-arm64": ["@parcel/watcher-android-arm64@2.5.6", "", { "os": "android", "cpu": "arm64" }, "sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A=="], + "@parcel/watcher": ["@parcel/watcher@2.6.0", "", { "dependencies": { "detect-libc": "^2.0.3", "is-glob": "^4.0.3", "node-addon-api": "^7.0.0", "picomatch": "^4.0.4" }, "optionalDependencies": { "@parcel/watcher-android-arm64": "2.6.0", "@parcel/watcher-darwin-arm64": "2.6.0", "@parcel/watcher-darwin-x64": "2.6.0", "@parcel/watcher-freebsd-x64": "2.6.0", "@parcel/watcher-linux-arm-glibc": "2.6.0", "@parcel/watcher-linux-arm-musl": "2.6.0", "@parcel/watcher-linux-arm64-glibc": "2.6.0", "@parcel/watcher-linux-arm64-musl": "2.6.0", "@parcel/watcher-linux-x64-glibc": "2.6.0", "@parcel/watcher-linux-x64-musl": "2.6.0", "@parcel/watcher-win32-arm64": "2.6.0", "@parcel/watcher-win32-x64": "2.6.0" } }, "sha512-7FNeNl8NCE7aINx7WXiKQrPYZWC/hvrTsmk6zmxbI7LTXE7hVek/n8AfVgpe2y82zl3w0HvCHN0bVKMBoJcC0w=="], - "@parcel/watcher-darwin-arm64": ["@parcel/watcher-darwin-arm64@2.5.6", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA=="], + "@parcel/watcher-android-arm64": ["@parcel/watcher-android-arm64@2.6.0", "", { "os": "android", "cpu": "arm64" }, "sha512-trgpLSCKRC/huFjXX/Smh+0sWe4+YtKfktIToiMl59ghz7z+qkH6kMvNnUbLyRs9N11t8l4svSCs1+5B3rOAhA=="], - "@parcel/watcher-darwin-x64": ["@parcel/watcher-darwin-x64@2.5.6", "", { "os": "darwin", "cpu": "x64" }, "sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg=="], + "@parcel/watcher-darwin-arm64": ["@parcel/watcher-darwin-arm64@2.6.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Y3QV0gl7Q1zbfueunkWIERICbEojQFCgpyG7YqOGNFLsckXyI1xu9mAIUpKY9QBYzBtSkN8dBPwd3yiAO9ovMw=="], - "@parcel/watcher-freebsd-x64": ["@parcel/watcher-freebsd-x64@2.5.6", "", { "os": "freebsd", "cpu": "x64" }, "sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng=="], + "@parcel/watcher-darwin-x64": ["@parcel/watcher-darwin-x64@2.6.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-Ohv6OpzhUfKYD7Beb8kDvG0jbIxORCYY1JRdZnaBtnjjkJxgD7ZVL0nw2sCYd0yTMKTvz3nnTnOF3cDifK+kvw=="], - "@parcel/watcher-linux-arm-glibc": ["@parcel/watcher-linux-arm-glibc@2.5.6", "", { "os": "linux", "cpu": "arm" }, "sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ=="], + "@parcel/watcher-freebsd-x64": ["@parcel/watcher-freebsd-x64@2.6.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-5HmXvDgs8VK+74jF9y9/2FE3/OnlcKmc56tjmSrEuZjpSZOGL+fvAu+HKJBdPs9uwoP2hE6TlSUpXZ/C5jUFmQ=="], - "@parcel/watcher-linux-arm-musl": ["@parcel/watcher-linux-arm-musl@2.5.6", "", { "os": "linux", "cpu": "arm" }, "sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg=="], + "@parcel/watcher-linux-arm-glibc": ["@parcel/watcher-linux-arm-glibc@2.6.0", "", { "os": "linux", "cpu": "arm" }, "sha512-Ps/hui3A+vMbjdqlqAowK2ZL8+BO8dBjxeWXj6npTBs3jx4wWmbPpaLuqwrQrSqIVMCnpWo238bJ1U37GhQOYg=="], - "@parcel/watcher-linux-arm64-glibc": ["@parcel/watcher-linux-arm64-glibc@2.5.6", "", { "os": "linux", "cpu": "arm64" }, "sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA=="], + "@parcel/watcher-linux-arm-musl": ["@parcel/watcher-linux-arm-musl@2.6.0", "", { "os": "linux", "cpu": "arm" }, "sha512-9c6AUHgHoG+IY88MRIHupztQiQnrbqHYQjkM2btA+Bf/wQnQMuiD0Wfk1EVv3TlNT3x41uU71rn6E4xh/+zvkw=="], - "@parcel/watcher-linux-arm64-musl": ["@parcel/watcher-linux-arm64-musl@2.5.6", "", { "os": "linux", "cpu": "arm64" }, "sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA=="], + "@parcel/watcher-linux-arm64-glibc": ["@parcel/watcher-linux-arm64-glibc@2.6.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-yHRqS2owEXe6Hic9z6Mh1ECsCd+ODVOGvZDyciqRd21+v+o+DnXMOrw50DSpIG2sb8GPEaPPmfeCAWKPJdq46g=="], - "@parcel/watcher-linux-x64-glibc": ["@parcel/watcher-linux-x64-glibc@2.5.6", "", { "os": "linux", "cpu": "x64" }, "sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ=="], + "@parcel/watcher-linux-arm64-musl": ["@parcel/watcher-linux-arm64-musl@2.6.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-WhB2e/V7rqdHHWZusBSPuy5Ei8S6lSz6FE5TKKQz5h3a0O+C+mhY7vxU9b/stqvMb8beLnPY82ZrFTLKs+SrKA=="], - "@parcel/watcher-linux-x64-musl": ["@parcel/watcher-linux-x64-musl@2.5.6", "", { "os": "linux", "cpu": "x64" }, "sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg=="], + "@parcel/watcher-linux-x64-glibc": ["@parcel/watcher-linux-x64-glibc@2.6.0", "", { "os": "linux", "cpu": "x64" }, "sha512-ulGE6x6Oz6iAwg75T8YQSoguBWasniIbX+QWpaYPcCnDOpdWX3k+4xbEYPZVLxOuoJI+svJJPD3sEj8G7lrQ3A=="], - "@parcel/watcher-win32-arm64": ["@parcel/watcher-win32-arm64@2.5.6", "", { "os": "win32", "cpu": "arm64" }, "sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q=="], + "@parcel/watcher-linux-x64-musl": ["@parcel/watcher-linux-x64-musl@2.6.0", "", { "os": "linux", "cpu": "x64" }, "sha512-tkBYKt7YQrjIJWYDnto2YgO8MRkjlMTSNoRHzsXinBqbLdeOM3L32wPZJvIZxqaLMfSlS/4sUjH/6STVP/XDLw=="], - "@parcel/watcher-win32-ia32": ["@parcel/watcher-win32-ia32@2.5.6", "", { "os": "win32", "cpu": "ia32" }, "sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g=="], + "@parcel/watcher-win32-arm64": ["@parcel/watcher-win32-arm64@2.6.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-gIZAP23jaHjGWasY/TY6yL7NHFClf0Ga7FN+iINvk+KN94rhm94lYZhFsbYFNcA04/onvGD9kKmiJLJB2HbNwQ=="], - "@parcel/watcher-win32-x64": ["@parcel/watcher-win32-x64@2.5.6", "", { "os": "win32", "cpu": "x64" }, "sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw=="], + "@parcel/watcher-win32-x64": ["@parcel/watcher-win32-x64@2.6.0", "", { "os": "win32", "cpu": "x64" }, "sha512-cA+/pXV2YkfxlIcXOQ5fSWqAzzPyD78/x5qbK/I0vUkrlYHA8TIz+MXjAbGouguKVSI4bOmkTSJ1/poVSsgt+A=="], "@paulirish/trace_engine": ["@paulirish/trace_engine@0.0.59", "", { "dependencies": { "legacy-javascript": "latest", "third-party-web": "latest" } }, "sha512-439NUzQGmH+9Y017/xCchBP9571J4bzhpcNhrxorf7r37wcyJZkgUfrUsRL3xl+JDcZ6ORhoFCzCw98c6S3YHw=="], - "@php-wasm/cli-util": ["@php-wasm/cli-util@3.1.33", "", { "dependencies": { "@php-wasm/util": "3.1.33", "fast-xml-parser": "^5.5.1", "jsonc-parser": "3.3.1" } }, "sha512-NCneC3hRrflP9VGSOoCiATxhsrR1/V+S7gTXXPsGeaeguRzn9ZTsdP6CBXRLLciIwQVA5/nynT3MMABR0SirDw=="], + "@php-wasm/cli-util": ["@php-wasm/cli-util@3.1.52", "", { "dependencies": { "@php-wasm/util": "3.1.52", "fast-xml-parser": "^5.8.0", "jsonc-parser": "3.3.1" } }, "sha512-/YP0JqY+l5SjB/kn3yeOe/Kdo88xUkIis3xbhtMivuARTBtxYC7tdHpW1uxJiw6dkmHR89tVFxiPA9PiZdS0/g=="], - "@php-wasm/logger": ["@php-wasm/logger@3.1.33", "", {}, "sha512-2tqVrBGPwJeVSVwZT9D5beVcSYoCAsaSa/5UkrkoBCBK0mMrH15ussZoc6qw1Qa6g5qbjT5Af2EZ/YkrJ7lNiA=="], + "@php-wasm/logger": ["@php-wasm/logger@3.1.52", "", {}, "sha512-Hr/pKVE4HPjQP4rwvAlZm0DvcEHlVFesHgAvASEc5LgOaKbULy7SVYvtozuuh1e+24Hg1n6CoxA0fKL+nsp+Dg=="], - "@php-wasm/node": ["@php-wasm/node@3.1.33", "", { "dependencies": { "@php-wasm/cli-util": "3.1.33", "@php-wasm/logger": "3.1.33", "@php-wasm/node-5-2": "3.1.33", "@php-wasm/node-7-4": "3.1.33", "@php-wasm/node-8-0": "3.1.33", "@php-wasm/node-8-1": "3.1.33", "@php-wasm/node-8-2": "3.1.33", "@php-wasm/node-8-3": "3.1.33", "@php-wasm/node-8-4": "3.1.33", "@php-wasm/node-8-5": "3.1.33", "@php-wasm/universal": "3.1.33", "@php-wasm/util": "3.1.33", "fs-ext-extra-prebuilt": "2.2.7", "wasm-feature-detect": "1.8.0", "ws": "8.18.0" } }, "sha512-rC+reJGZCw+k1uBTtSXOvLjVkNPLLOsv1w+u6o65oCS/Np6eRZ9BhL9Ip/ELq6YMR1GOFOEXdWKyrkQkTEMUng=="], + "@php-wasm/node": ["@php-wasm/node@3.1.52", "", { "dependencies": { "@php-wasm/cli-util": "3.1.52", "@php-wasm/logger": "3.1.52", "@php-wasm/node-5-2": "3.1.52", "@php-wasm/node-7-4": "3.1.52", "@php-wasm/node-8-0": "3.1.52", "@php-wasm/node-8-1": "3.1.52", "@php-wasm/node-8-2": "3.1.52", "@php-wasm/node-8-3": "3.1.52", "@php-wasm/node-8-4": "3.1.52", "@php-wasm/node-8-5": "3.1.52", "@php-wasm/universal": "3.1.52", "@php-wasm/util": "3.1.52", "fs-ext-extra-prebuilt": "2.2.7", "wasm-feature-detect": "1.8.0", "ws": "8.21.0" } }, "sha512-5fRw4dMvLGfRKHLZ7iGANVNQ8eGcq8Of91NcKo6qW8TorAIwAhTz+RQHuFtjI2zC7bq21E3IHxLa2I8338yX5A=="], - "@php-wasm/node-5-2": ["@php-wasm/node-5-2@3.1.33", "", { "dependencies": { "@php-wasm/universal": "3.1.33", "wasm-feature-detect": "1.8.0" } }, "sha512-sW0YRW5qvP6gr8JYRODEeFZIyeEwa3kEiAmP9ISeMkbN0ZluNPtDH/8+Bt2vb63KYPjly5gUp9fVymZ0Mowrjg=="], + "@php-wasm/node-5-2": ["@php-wasm/node-5-2@3.1.52", "", { "dependencies": { "@php-wasm/universal": "3.1.52", "wasm-feature-detect": "1.8.0" } }, "sha512-z/RzVUr9NPPIe/41VWyJJ5YETEbHwkbq9Jk5fLgc9xhkBDh8EmKRz3MptgvcQyF1IZyuPW4ADe3AZ+R24LrjQw=="], - "@php-wasm/node-7-4": ["@php-wasm/node-7-4@3.1.33", "", { "dependencies": { "@php-wasm/universal": "3.1.33", "wasm-feature-detect": "1.8.0" } }, "sha512-c4UKmnRZr4VoiSj0iWLdDFEdHRX+KN78Oul8VGfal1ChjTKm/aRL6C4A4fV2zegjPp41BvbqagXLGJZWHlG5uQ=="], + "@php-wasm/node-7-4": ["@php-wasm/node-7-4@3.1.52", "", { "dependencies": { "@php-wasm/universal": "3.1.52", "wasm-feature-detect": "1.8.0" } }, "sha512-e31adpo6SOl7mlptVpHCJwtlDNZWbP/KvPVmkYubs5wtstAzY8YeGzYWndGDUh43SqBr+zxiB9CH2B77IgAyIg=="], - "@php-wasm/node-8-0": ["@php-wasm/node-8-0@3.1.33", "", { "dependencies": { "@php-wasm/universal": "3.1.33", "wasm-feature-detect": "1.8.0" } }, "sha512-x1Qf+zLj9zcT1cqm3L638Ks6BLpkpSjW8SQYIgMifyLxu709eY7BLnr1Za7TfmpH7p8I2gSXSSz0rCw/V918FA=="], + "@php-wasm/node-8-0": ["@php-wasm/node-8-0@3.1.52", "", { "dependencies": { "@php-wasm/universal": "3.1.52", "wasm-feature-detect": "1.8.0" } }, "sha512-+Po4d45fSqxgbPPeYRP7XNdc1oCGOWbuxluB0jJthA60LaTtLC4JEQ2B02BhE07gB2W+Nmvvf+HHY3e05JrvQw=="], - "@php-wasm/node-8-1": ["@php-wasm/node-8-1@3.1.33", "", { "dependencies": { "@php-wasm/universal": "3.1.33", "wasm-feature-detect": "1.8.0" } }, "sha512-SxgQjc8/+cXiw+hnhP3+bPdXRv9HImaPap71P5+cEGvk0Xzz9PxuVpnP1IEFQ81nVEON2+acgU8TVuLSQGz3kA=="], + "@php-wasm/node-8-1": ["@php-wasm/node-8-1@3.1.52", "", { "dependencies": { "@php-wasm/universal": "3.1.52", "wasm-feature-detect": "1.8.0" } }, "sha512-H6wh4NDRTvDanVnumhN5dpSCUsKqBujW/84hHQcyZURGTS36frp1Runr5mmapRF/ZpyH7q+uG1kFzYEYkZIlaQ=="], - "@php-wasm/node-8-2": ["@php-wasm/node-8-2@3.1.33", "", { "dependencies": { "@php-wasm/universal": "3.1.33", "wasm-feature-detect": "1.8.0" } }, "sha512-tlZR0rP1ekXhn6qJR361Wjrhls7pGME/u53hzNnzxg566gIA6BspY9LL2CRCckBs6tlDIiMdgt64TGLmro5sbg=="], + "@php-wasm/node-8-2": ["@php-wasm/node-8-2@3.1.52", "", { "dependencies": { "@php-wasm/universal": "3.1.52", "wasm-feature-detect": "1.8.0" } }, "sha512-+PIiU8whNov93e3VnojZik0dDciRkqwd+j2+nm4VDcXfHD9SewHP+k3chaUipTAhDDx8Q6fWYWa1CSGp5jrAtg=="], - "@php-wasm/node-8-3": ["@php-wasm/node-8-3@3.1.33", "", { "dependencies": { "@php-wasm/universal": "3.1.33", "wasm-feature-detect": "1.8.0" } }, "sha512-2Y7GR1Gam72I9qikFPwbKedADBA05oPnhgf15bgQOLmrmRgZxVfLWt2WBQdAarT4//tvoKNIbtyTZ1vz4RllSw=="], + "@php-wasm/node-8-3": ["@php-wasm/node-8-3@3.1.52", "", { "dependencies": { "@php-wasm/universal": "3.1.52", "wasm-feature-detect": "1.8.0" } }, "sha512-UNkxXw7qUfeS6jG0luztYGosZHZaVMiziaPwY6FFUH0FnHwhrtFpYLI86ksfOZMnS9BjDf7bryIrdr0160tIJQ=="], - "@php-wasm/node-8-4": ["@php-wasm/node-8-4@3.1.33", "", { "dependencies": { "@php-wasm/universal": "3.1.33", "wasm-feature-detect": "1.8.0" } }, "sha512-aduJAIccZnfYTTfV9LgvBoOWQroqOBo0K0VjRexGX1AC0IkLHA/abGU4+IYOSVXzhCpxNhlgqEwF45867vk2HA=="], + "@php-wasm/node-8-4": ["@php-wasm/node-8-4@3.1.52", "", { "dependencies": { "@php-wasm/universal": "3.1.52", "wasm-feature-detect": "1.8.0" } }, "sha512-M7L3lU0co6dPPi3PHs3agG6eeOHAszyJfUq/KmrmRReBJNHyviEcHpaGKextGJArJLfMvAAZjrhGOWVMBrQc/w=="], - "@php-wasm/node-8-5": ["@php-wasm/node-8-5@3.1.33", "", { "dependencies": { "@php-wasm/universal": "3.1.33", "wasm-feature-detect": "1.8.0" } }, "sha512-DdXinP9yBK6yEehNlTJsNtBCL2fiWO3QPQw+y907mxONLtWUQJllE36LCJn7nosFBnm0hx5BFrb5IMCw5WpnBg=="], + "@php-wasm/node-8-5": ["@php-wasm/node-8-5@3.1.52", "", { "dependencies": { "@php-wasm/universal": "3.1.52", "wasm-feature-detect": "1.8.0" } }, "sha512-7Y6EkujT5tUTiZKZYVsG8L7cAlLvpl6X5TX+SP1C7YZnxnpZBafX4j/4reQGrYTKdvrK/8NklRH73BQkXhYWhg=="], - "@php-wasm/progress": ["@php-wasm/progress@3.1.33", "", { "dependencies": { "@php-wasm/logger": "3.1.33" } }, "sha512-tD3OScNiqJKmaFP6g2rbUG1BR9m4ms5EhTHUUbCXi6Pe207Z10SzOzH/KDHlfdAFTBRaJSKc2332ibTfNOiQmQ=="], + "@php-wasm/progress": ["@php-wasm/progress@3.1.52", "", { "dependencies": { "@php-wasm/logger": "3.1.52" } }, "sha512-Zr4pHQDyX+OhkiLm830x0nt38L6ZRK3cWJMJNYSxvhlN7YKEmTHoA8hifchIE7OfgpF++s0rORXoBvEX5MmteA=="], - "@php-wasm/scopes": ["@php-wasm/scopes@3.1.33", "", {}, "sha512-KoQNC+HAGI94iFTWbs/APvPeuiFIp4wrvl6Qr1wLnoTohP9wfI4KDwMeCaQ185WyRivdjHnzRD5aBTiFY9XGAA=="], + "@php-wasm/scopes": ["@php-wasm/scopes@3.1.52", "", {}, "sha512-1+f6czXaQVtO+LT8Bx9gORg/dQ+L5M7Kkp1Bk69RJE9nde6ZO/ex/wLymCx0nORHN01k6csqG2j/Nnew4KLRLg=="], - "@php-wasm/stream-compression": ["@php-wasm/stream-compression@3.1.33", "", { "dependencies": { "@php-wasm/util": "3.1.33" } }, "sha512-pF3PK3weuAxylUYfX3mJo1EbMpR68eyg67XKCD/N9rnA2EhWO/8lyZQLy30jbVBGGcacAS7kfH41rZI/W23dTQ=="], + "@php-wasm/stream-compression": ["@php-wasm/stream-compression@3.1.52", "", { "dependencies": { "@php-wasm/util": "3.1.52" } }, "sha512-RpCCUpF/BwPLbqhUWxHz4utRtu5gSM66SaCFQkxdjAGI5yitaptsu1W6Z7Wp2UDabF3g1qfKfDog0JQ3D9azcw=="], - "@php-wasm/universal": ["@php-wasm/universal@3.1.33", "", { "dependencies": { "@php-wasm/logger": "3.1.33", "@php-wasm/progress": "3.1.33", "@php-wasm/stream-compression": "3.1.33", "@php-wasm/util": "3.1.33", "ini": "4.1.2" } }, "sha512-0KA3uHLN0DfcIy+w7Vj25Cgri2HoDjf5L9OhRZ80RbfE0iAAvkZo25TPbz2LtOg2ok3IPDkV4hyjBFhPy8wl1g=="], + "@php-wasm/universal": ["@php-wasm/universal@3.1.52", "", { "dependencies": { "@php-wasm/logger": "3.1.52", "@php-wasm/progress": "3.1.52", "@php-wasm/stream-compression": "3.1.52", "@php-wasm/util": "3.1.52", "ini": "4.1.2" } }, "sha512-vgEV73SfpECzcCuTmr8+tGEzK6syk0p2I6E5CX2kJaE1/prCc4x5DyZtQ0dwhnzcEGrbhKDL2mpxxgl4B9fQOA=="], - "@php-wasm/util": ["@php-wasm/util@3.1.33", "", {}, "sha512-+qXffKoRt5JeP0TYxofm8JnYH4XRvlLMywYcofF/4qmsREFEVwOS2O2L3m7KAAhq2YGgkC/aFLo0qkzSJ5xsJA=="], + "@php-wasm/util": ["@php-wasm/util@3.1.52", "", {}, "sha512-lwxtwyIXEO8537eCv5iBfx1WW+DhSYc6obgtTQ6Up85GbHCE050n0RbOWva4XBu7T3Y5PfQshPoPccM/l14chA=="], - "@php-wasm/web-service-worker": ["@php-wasm/web-service-worker@3.1.33", "", { "dependencies": { "@php-wasm/scopes": "3.1.33", "@php-wasm/universal": "3.1.33" } }, "sha512-Dikj8YFCcMfV3QFRAvlsXjpgE/FmcYSOqGG9AKKRPJqkzHAVamCc28zCC3vLiGLKhnWIRwBytV6gVhmCxaFe0g=="], + "@php-wasm/web-service-worker": ["@php-wasm/web-service-worker@3.1.52", "", { "dependencies": { "@php-wasm/scopes": "3.1.52", "@php-wasm/universal": "3.1.52" } }, "sha512-jEajg31JjVEdLX9yeQ1pa34dtztfMiz6I5y20/LZ3NADO9NrSvcAPsjYf2NkN4cpUDz4mKs6hkOskA6gd1CVxw=="], - "@php-wasm/xdebug-bridge": ["@php-wasm/xdebug-bridge@3.1.33", "", { "dependencies": { "@php-wasm/logger": "3.1.33", "@php-wasm/universal": "3.1.33", "ws": "8.18.0", "xml2js": "0.6.2", "yargs": "17.7.2" }, "bin": { "xdebug-bridge": "xdebug-bridge.js" } }, "sha512-tUNErqn3jXks2mh51V6rboNUazGzQrekJdmzOd3ESfAcwIdWuTmTevCXKkDS0q3LDkQhto1VfBK4acncZVfkCg=="], + "@php-wasm/xdebug-bridge": ["@php-wasm/xdebug-bridge@3.1.52", "", { "dependencies": { "@php-wasm/logger": "3.1.52", "@php-wasm/universal": "3.1.52", "ws": "8.21.0", "xml2js": "0.6.2", "yargs": "17.7.2" }, "bin": { "xdebug-bridge": "xdebug-bridge.js" } }, "sha512-I5yMzjRe+Ivh6N2e5QSh8Fy3VN9WIv7YFhqFOlN3eq0UKCt3gDERCOtt96VMulWYH2m8qmYvpcX20h6p3T2Hyw=="], "@pkgjs/parseargs": ["@pkgjs/parseargs@0.11.0", "", {}, "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg=="], - "@playwright/test": ["@playwright/test@1.62.1", "", { "dependencies": { "playwright": "1.62.1" }, "bin": { "playwright": "cli.js" } }, "sha512-DTcUc8qii+cpHvtOwggMtBRMjKZHXYWdw8syRYu2vtzuq4Wxphqq4NfCs5Zt44L6mA8rfDfj+PHnxFc/FeK6mQ=="], + "@playwright/test": ["@playwright/test@1.63.0", "", { "dependencies": { "playwright": "1.63.0" }, "bin": { "playwright": "cli.js" } }, "sha512-oxMK4vllB9RK5NQ2l1pq1IfOf2AvnEuj/vYGDj0H2nMtmtZpKtCwt/l00GEO6xjGfpBNAvjovvYdCm50dRQkpQ=="], "@prisma/instrumentation": ["@prisma/instrumentation@6.11.1", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.52.0 || ^0.53.0 || ^0.54.0 || ^0.55.0 || ^0.56.0 || ^0.57.0" }, "peerDependencies": { "@opentelemetry/api": "^1.8" } }, "sha512-mrZOev24EDhnefmnZX7WVVT7v+r9LttPRqf54ONvj6re4XMF7wFTpK2tLJi4XHB7fFp/6xhYbgRel8YV7gQiyA=="], - "@puppeteer/browsers": ["@puppeteer/browsers@2.13.2", "", { "dependencies": { "debug": "^4.4.3", "extract-zip": "^2.0.1", "progress": "^2.0.3", "proxy-agent": "^6.5.0", "semver": "^7.7.4", "tar-fs": "^3.1.1", "yargs": "^17.7.2" }, "bin": { "browsers": "lib/cjs/main-cli.js" } }, "sha512-5EUZSUIc37H6aIXyWO0Z4y8NlF8NnjgmqeQgOGiswAU7pY0HOo16ho4+alIWmSfdZnjqBRawMsP3I5YqLSn6kw=="], + "@puppeteer/browsers": ["@puppeteer/browsers@2.3.0", "", { "dependencies": { "debug": "^4.3.5", "extract-zip": "^2.0.1", "progress": "^2.0.3", "proxy-agent": "^6.4.0", "semver": "^7.6.3", "tar-fs": "^3.0.6", "unbzip2-stream": "^1.4.3", "yargs": "^17.7.2" }, "bin": { "browsers": "lib/cjs/main-cli.js" } }, "sha512-ioXoq9gPxkss4MYhD+SFaU9p1IHFUX0ILAWFPyjGaBdjLsYAlZw6j1iLA0N/m12uVHLFDfSYNF7EQccjinIMDA=="], "@sentry/core": ["@sentry/core@9.47.1", "", {}, "sha512-KX62+qIt4xgy8eHKHiikfhz2p5fOciXd0Cl+dNzhgPFq8klq4MGMNaf148GB3M/vBqP4nw/eFvRMAayFCgdRQw=="], @@ -281,7 +290,7 @@ "@tootallnate/quickjs-emscripten": ["@tootallnate/quickjs-emscripten@0.23.0", "", {}, "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA=="], - "@types/aws-lambda": ["@types/aws-lambda@8.10.161", "", {}, "sha512-rUYdp+MQwSFocxIOcSsYSF3YYYC/uUpMbCY/mbO21vGqfrEYvNSoPyKYDj6RhXXpPfS0KstW9RwG3qXh9sL7FQ=="], + "@types/aws-lambda": ["@types/aws-lambda@8.10.163", "", {}, "sha512-+4zuoEB3S8RIhimtOFT7zAEk2SbpwrKjjGl9CyYnQR6k08uynxfauIIB0pDU1ssr05F8oyGiETwpn+8eXZMqPw=="], "@types/btoa-lite": ["@types/btoa-lite@1.0.2", "", {}, "sha512-ZYbcE2x7yrvNFJiU7xJGrpF/ihpkM7zKgw8bha3LNJSesvTtUNxbpzaT7WXBIryf6jovisrxTBvymxMeLLj1Mg=="], @@ -299,7 +308,7 @@ "@types/mysql": ["@types/mysql@2.15.26", "", { "dependencies": { "@types/node": "*" } }, "sha512-DSLCOXhkvfS5WNNPbfn2KdICAmk8lLc+/PNvnPnF7gOdMZCxopXduqv0OQ13y/yA/zXTSikZZqVgybUxOEg6YQ=="], - "@types/node": ["@types/node@26.2.0", "", { "dependencies": { "undici-types": "~8.3.0" } }, "sha512-5IviulTZeRNp2vAJ514cc/HUlY5nZ9fCbq9DMyC52BrhFZACo3nI0R7qBxhQmo/d27NFe96ur/b7Wwxklda+kg=="], + "@types/node": ["@types/node@26.4.1", "", { "dependencies": { "undici-types": "~8.3.0" } }, "sha512-k97ENvZWtvA6yqz5/FS6a7duDgOPEeOQOc2iKS/nY6mX6qJUKtLnWzQS+Xj6tXweyj6ZcTAK2Qecetnvi9nCLA=="], "@types/pg": ["@types/pg@8.6.1", "", { "dependencies": { "@types/node": "*", "pg-protocol": "*", "pg-types": "^2.2.0" } }, "sha512-1Kc4oAGzAl7uqUStZCDvaLFqZrW9qWSjXOmBfdgyBP5La7Us6Mg4GBvRlSoaZMhQF/zSj1C8CtKMBkoiT8eL8w=="], @@ -313,21 +322,21 @@ "@types/yauzl": ["@types/yauzl@2.10.3", "", { "dependencies": { "@types/node": "*" } }, "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q=="], - "@wordpress/e2e-test-utils-playwright": ["@wordpress/e2e-test-utils-playwright@1.52.0", "", { "dependencies": { "change-case": "^4.1.2", "get-port": "^5.1.1", "lighthouse": "^12.2.2", "mime": "^3.0.0", "web-vitals": "^4.2.1" }, "peerDependencies": { "@playwright/test": ">=1", "@types/node": "^20.17.10" } }, "sha512-LK0/WJd8iGfTo9ONaHrLSBh0IjKHeXU7urZPaNuXXB7jdt+coLTF+y0gP4c6sQ5m9OgfQqf01FPT/t2XzEbJ+w=="], + "@wordpress/e2e-test-utils-playwright": ["@wordpress/e2e-test-utils-playwright@1.54.0", "", { "dependencies": { "change-case": "^4.1.2", "get-port": "^5.1.1", "lighthouse": "^12.2.2", "mime": "^3.0.0", "web-vitals": "^4.2.1" }, "peerDependencies": { "@playwright/test": ">=1", "@types/node": "^20.17.10" } }, "sha512-xpsb5c8T8VXBBrYfr98OqK2yevtiHVwpVE+u0vqYBYgWNiqQJj8Eyq7geRdY6v4SctbAVe8vGFVV+DfPaEhvRg=="], - "@wordpress/env": ["@wordpress/env@11.12.0", "", { "dependencies": { "@inquirer/prompts": "^7.2.0", "@wp-playground/cli": "^3.0.48", "adm-zip": "^0.5.9", "chalk": "^4.1.1", "copy-dir": "^1.3.0", "cross-spawn": "^7.0.6", "docker-compose": "^0.24.3", "got": "^11.8.5", "js-yaml": "^3.15.0", "ora": "^4.0.2", "rimraf": "^5.0.10", "simple-git": "^3.32.3", "yargs": "^17.3.0" }, "bin": { "wp-env": "bin/wp-env" } }, "sha512-P1mYGEgnkYCbBPRaT9uAyxe3hFfsfkvxXKQ+Pfb00z/mXz5xbPC48ZdXTQmxTcpaj0nDwJfrBz0vzc074B5nrA=="], + "@wordpress/env": ["@wordpress/env@11.14.0", "", { "dependencies": { "@inquirer/prompts": "^7.2.0", "@wp-playground/cli": "^3.0.48", "adm-zip": "^0.6.0", "chalk": "^4.1.1", "copy-dir": "^1.3.0", "cross-spawn": "^7.0.6", "docker-compose": "^0.24.3", "got": "^11.8.5", "js-yaml": "^3.15.0", "ora": "^4.0.2", "rimraf": "^5.0.10", "simple-git": "^3.32.3", "yargs": "^17.3.0" }, "bin": { "wp-env": "bin/wp-env" } }, "sha512-Q/XUhGjFJtlfybw/mq+7H5MsF2u3zWH5YxNR5y473+CeIjZx20wt5Dx0RDHAJcG2ICTky4pJevNlIq/EFnUwIQ=="], - "@wp-playground/blueprints": ["@wp-playground/blueprints@3.1.33", "", { "dependencies": { "@php-wasm/logger": "3.1.33", "@php-wasm/progress": "3.1.33", "@php-wasm/stream-compression": "3.1.33", "@php-wasm/universal": "3.1.33", "@php-wasm/util": "3.1.33", "@php-wasm/web-service-worker": "3.1.33", "@wp-playground/common": "3.1.33", "@wp-playground/storage": "3.1.33", "@wp-playground/wordpress": "3.1.33", "ajv": "8.12.0" } }, "sha512-bAs0MOBgXPDYtsO2tQcXSqveEaye8xcNGOQvovvE6c5pZWD4RlsiuZ71oKGmtq7JJhgdLTNj0lkcF9f2NX6vrg=="], + "@wp-playground/blueprints": ["@wp-playground/blueprints@3.1.52", "", { "dependencies": { "@php-wasm/logger": "3.1.52", "@php-wasm/progress": "3.1.52", "@php-wasm/stream-compression": "3.1.52", "@php-wasm/universal": "3.1.52", "@php-wasm/util": "3.1.52", "@php-wasm/web-service-worker": "3.1.52", "@wp-playground/common": "3.1.52", "@wp-playground/storage": "3.1.52", "@wp-playground/wordpress": "3.1.52", "ajv": "8.18.0" } }, "sha512-K4QieiesG8MgZnKQerObS7dON4ngZCDt32aqnYLeaTiSJ2jFXqMcfBXH8MjFO3KVncJsTfU2euh8OtDV1fKkqA=="], - "@wp-playground/cli": ["@wp-playground/cli@3.1.33", "", { "dependencies": { "@php-wasm/cli-util": "3.1.33", "@php-wasm/logger": "3.1.33", "@php-wasm/node": "3.1.33", "@php-wasm/progress": "3.1.33", "@php-wasm/universal": "3.1.33", "@php-wasm/util": "3.1.33", "@php-wasm/xdebug-bridge": "3.1.33", "@wp-playground/blueprints": "3.1.33", "@wp-playground/common": "3.1.33", "@wp-playground/storage": "3.1.33", "@wp-playground/tools": "3.1.33", "@wp-playground/wordpress": "3.1.33", "express": "4.22.0", "fs-extra": "11.1.1", "tmp-promise": "3.0.3", "wasm-feature-detect": "1.8.0", "yargs": "17.7.2" }, "bin": { "wp-playground-cli": "wp-playground.js" } }, "sha512-LPwtUp1LMJ+uExJ09iM7AJLrQ+0x1IMA2GAjED/ndrWfScKkmsMnGZ5zoam0UZOWDhFa34aKpeuSk1ZfOjCdMg=="], + "@wp-playground/cli": ["@wp-playground/cli@3.1.52", "", { "dependencies": { "@php-wasm/cli-util": "3.1.52", "@php-wasm/logger": "3.1.52", "@php-wasm/node": "3.1.52", "@php-wasm/progress": "3.1.52", "@php-wasm/universal": "3.1.52", "@php-wasm/util": "3.1.52", "@php-wasm/xdebug-bridge": "3.1.52", "@wp-playground/blueprints": "3.1.52", "@wp-playground/common": "3.1.52", "@wp-playground/storage": "3.1.52", "@wp-playground/tools": "3.1.52", "@wp-playground/wordpress": "3.1.52", "express": "4.22.2", "fs-extra": "11.1.1", "tmp-promise": "3.0.3", "wasm-feature-detect": "1.8.0", "yargs": "17.7.2" }, "bin": { "wp-playground-cli": "wp-playground.js" } }, "sha512-NXApYcnZwKGOL/E6rdAwHKXbyPFMRIBKF9SX/TlxH9TOgBef0eblwjylnxnYzdAuiOzdJT7PhO4gJw2WSFTZAw=="], - "@wp-playground/common": ["@wp-playground/common@3.1.33", "", { "dependencies": { "@php-wasm/universal": "3.1.33", "@php-wasm/util": "3.1.33" } }, "sha512-73H72BTZDZPQ+/VaQG6W3nTlYFWBOxTMqGBsSQQBEvDKhqi/Yn9aQCI8sKzqIU+TbhIAB+K2oLJX/47maMIk2Q=="], + "@wp-playground/common": ["@wp-playground/common@3.1.52", "", { "dependencies": { "@php-wasm/universal": "3.1.52", "@php-wasm/util": "3.1.52" } }, "sha512-QGE8CdykgfVEjqRKMXMFsXOwh3MV26FkXJ4c/HzsKKAaRt+zwp7BAK2s6jht40iz9TVDR3ZPcpBrSltfmjIshQ=="], - "@wp-playground/storage": ["@wp-playground/storage@3.1.33", "", { "dependencies": { "@php-wasm/stream-compression": "3.1.33", "@php-wasm/universal": "3.1.33", "@php-wasm/util": "3.1.33", "@zip.js/zip.js": "2.7.57", "isomorphic-git": "1.37.6", "octokit": "3.1.2", "pako": "^1.0.10" } }, "sha512-z5GRPjEz3cI+hHhw3njvsmUWP4tQeobiL+yc3p6QmERmiWEWHrcph80bcoA3IQz5y/VFscBzb9K0lqm1rMtPuQ=="], + "@wp-playground/storage": ["@wp-playground/storage@3.1.52", "", { "dependencies": { "@php-wasm/stream-compression": "3.1.52", "@php-wasm/universal": "3.1.52", "@php-wasm/util": "3.1.52", "@zip.js/zip.js": "2.7.57", "isomorphic-git": "1.37.6", "octokit": "3.1.2", "pako": "^1.0.10", "sha.js": "2.4.12" } }, "sha512-hUQLdZ5iSC8Y01o06aMK/m9DZmMjo2cgl52MvXxR8Cuma+xgrMnlC+G1n7lnjaT+5Wbo58KaawxjZJxUpgcvxw=="], - "@wp-playground/tools": ["@wp-playground/tools@3.1.33", "", { "dependencies": { "@wp-playground/blueprints": "3.1.33" } }, "sha512-AvrjQClj/rQw7HiRn6zAuUvGYdbS/F4bAQVpL6QkCj3FHMBOqbvgC0UGWXMFuppBsYXawZDbWMBnDzRYEelBjQ=="], + "@wp-playground/tools": ["@wp-playground/tools@3.1.52", "", { "dependencies": { "@php-wasm/util": "3.1.52", "@wp-playground/blueprints": "3.1.52" } }, "sha512-rn604x/fH2VFW6rYw3mN5idaMh03sKIbxoeBDPZsh6Ca1Hv9oyheiQFEy0Y3Kzli4B58YwbRUcC0wlv3laT3hw=="], - "@wp-playground/wordpress": ["@wp-playground/wordpress@3.1.33", "", { "dependencies": { "@php-wasm/logger": "3.1.33", "@php-wasm/universal": "3.1.33", "@php-wasm/util": "3.1.33", "@wp-playground/common": "3.1.33" } }, "sha512-ZdDEiYElMF7T5c8oc96AeQgTtL3b3M9RvrgJTtaQuVrrAFHJ7f5LZ7C4jpnq6KvpcEm+TnUvvvCYy8KMk/L6nQ=="], + "@wp-playground/wordpress": ["@wp-playground/wordpress@3.1.52", "", { "dependencies": { "@php-wasm/logger": "3.1.52", "@php-wasm/universal": "3.1.52", "@php-wasm/util": "3.1.52", "@wp-playground/common": "3.1.52", "zstddec": "^0.2.0" } }, "sha512-vXvgrN33y3zvxWxVjtEEb4L4ZNfgBRPlvVe6wXHB19Dbiu32ZLkrlUpEkpKvft7wnrXnWvbDJqbEBfU2rKJtqw=="], "@zip.js/zip.js": ["@zip.js/zip.js@2.7.57", "", {}, "sha512-BtonQ1/jDnGiMed6OkV6rZYW78gLmLswkHOzyMrMb+CAR7CZO8phOHO6c2qw6qb1g1betN7kwEHhhZk30dv+NA=="], @@ -335,17 +344,17 @@ "accepts": ["accepts@1.3.8", "", { "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" } }, "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw=="], - "acorn": ["acorn@8.16.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw=="], + "acorn": ["acorn@8.18.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ=="], "acorn-import-attributes": ["acorn-import-attributes@1.9.5", "", { "peerDependencies": { "acorn": "^8" } }, "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ=="], - "adm-zip": ["adm-zip@0.5.17", "", {}, "sha512-+Ut8d9LLqwEvHHJl1+PIHqoyDxFgVN847JTVM3Izi3xHDWPE4UtzzXysMZQs64DMcrJfBeS/uoEP4AD3HQHnQQ=="], + "adm-zip": ["adm-zip@0.6.0", "", {}, "sha512-XleryMhbuksdKtofnWZ9Sk+4CUTbms4Mb/EU32SZwToAyZ5RgVos/ki8n+yr0LWHOGKuakbXTuuYNHLQjhddgg=="], "agent-base": ["agent-base@7.1.4", "", {}, "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="], "aggregate-error": ["aggregate-error@3.1.0", "", { "dependencies": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" } }, "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA=="], - "ajv": ["ajv@8.12.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", "uri-js": "^4.2.2" } }, "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA=="], + "ajv": ["ajv@8.18.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A=="], "ansi-colors": ["ansi-colors@1.1.0", "", { "dependencies": { "ansi-wrap": "^0.1.0" } }, "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA=="], @@ -357,6 +366,8 @@ "anymatch": ["anymatch@3.1.3", "", { "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw=="], + "anynum": ["anynum@1.0.1", "", {}, "sha512-N6//FLET/tXYNM/F6ABca1oH6fWB+KlTt909Le28WMDBk8oaT4vY17DCrwg2MvmuqUKt3Ni4N5dGJ/EoBgcO6A=="], + "archiver": ["archiver@8.0.0", "", { "dependencies": { "async": "^3.2.4", "buffer-crc32": "^1.0.0", "is-stream": "^4.0.0", "lazystream": "^1.0.0", "normalize-path": "^3.0.0", "readable-stream": "^4.0.0", "readdir-glob": "^3.0.0", "tar-stream": "^3.0.0", "zip-stream": "^7.0.2" } }, "sha512-fV1orZfsnPn9BaSByR/qE67rJCLJEy2Ox5bq7nJh+jquWaNh6Sfec75kJ2T6PtdGUbPQlrVoSVCEOa5SdiTQ1g=="], "argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="], @@ -387,25 +398,25 @@ "available-typed-arrays": ["available-typed-arrays@1.0.7", "", { "dependencies": { "possible-typed-array-names": "^1.0.0" } }, "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ=="], - "axe-core": ["axe-core@4.11.4", "", {}, "sha512-KunSNx+TVpkAw/6ULfhnx+HWRecjqZGTOyquAoWHYLRSdK1tB5Ihce1ZW+UY3fj33bYAFWPu7W/GRSmmrCGuxA=="], + "axe-core": ["axe-core@4.13.0", "", {}, "sha512-UzGt8zg7Ny8djbYMhxl2zuEevVa7r2gJjYY5Lwr1xM7+XU2nd6CkIWFTVcCIbAP63vSz71NaVyyuSk9lHKcy0A=="], "b4a": ["b4a@1.8.1", "", { "peerDependencies": { "react-native-b4a": "*" }, "optionalPeers": ["react-native-b4a"] }, "sha512-aiqre1Nr0B/6DgE2N5vwTc+2/oQZ4Wh1t4NznYY4E00y8LCt6NqdRv81so00oo27D8MVKTpUa/MwUUtBLXCoDw=="], "bach": ["bach@2.0.1", "", { "dependencies": { "async-done": "^2.0.0", "async-settle": "^2.0.0", "now-and-later": "^3.0.0" } }, "sha512-A7bvGMGiTOxGMpNupYl9HQTf0FFDNF4VCmks4PJpFyN1AX2pdKuxuwdvUz2Hu388wcgp+OvGFNsumBfFNkR7eg=="], - "balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], + "backstopjs": ["backstopjs@6.3.25", "", { "dependencies": { "@mirzazeyrek/node-resemble-js": "^1.2.1", "chalk": "^4.1.2", "diverged": "^0.1.3", "fs-extra": "^11.2.0", "jump.js": "^1.0.2", "junit-report-builder": "^3.1.0", "lodash": "^4.17.21", "minimist": "^1.2.8", "object-hash": "3.0.0", "opn": "^6.0.0", "os": "^0.1.2", "p-map": "^4.0.0", "path": "^0.12.7", "playwright": "^1.40.1", "portfinder": "^1.0.32", "puppeteer": "^22.1.0", "super-simple-web-server": "^1.1.4", "temp": "^0.9.4" }, "bin": { "backstop": "cli/index.js" } }, "sha512-jy0dxlk45tItXLcj9zjRTCyCa6D27M9OMK5kM8To0ELLclKhI/dWn/igUTMBBMJXe4Kql+CGyDRErMtTv2+40Q=="], - "bare-events": ["bare-events@2.8.3", "", { "peerDependencies": { "bare-abort-controller": "*" }, "optionalPeers": ["bare-abort-controller"] }, "sha512-HdUm8EMQBLaJvGUdidNNbqpA1kYkwNcb+MYxkxCLAPJGQzlv9J0C24h8V65Z4c5GLd/JEALDvpFCQgpLJqc0zw=="], + "balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], - "bare-fs": ["bare-fs@4.7.1", "", { "dependencies": { "bare-events": "^2.5.4", "bare-path": "^3.0.0", "bare-stream": "^2.6.4", "bare-url": "^2.2.2", "fast-fifo": "^1.3.2" }, "peerDependencies": { "bare-buffer": "*" }, "optionalPeers": ["bare-buffer"] }, "sha512-WDRsyVN52eAx/lBamKD6uyw8H4228h/x0sGGGegOamM2cd7Pag88GfMQalobXI+HaEUxpCkbKQUDOQqt9wawRw=="], + "bare-events": ["bare-events@2.9.2", "", { "peerDependencies": { "bare-abort-controller": "*" }, "optionalPeers": ["bare-abort-controller"] }, "sha512-AIPKioV7/Y/8KfZ3AAhjPJxLLbY49S64Ym5DakZlUg75qQiTgUq9hEJoEwa4eUezPUlXRy/i5NpsKvo9jgKmoA=="], - "bare-os": ["bare-os@3.9.1", "", {}, "sha512-6M5XjcnsygQNPMCMPXSK379xrJFiZ/AEMNBmFEmQW8d/789VQATvriyi5r0HYTL9TkQ26rn3kgdTG3aisbrXkQ=="], + "bare-fs": ["bare-fs@4.8.1", "", { "dependencies": { "bare-events": "^2.5.4", "bare-path": "^3.0.0", "bare-stream": "^2.6.4", "bare-url": "^2.2.2", "fast-fifo": "^1.3.2" }, "peerDependencies": { "bare-buffer": "*" }, "optionalPeers": ["bare-buffer"] }, "sha512-N1nnXdHZAOSstz0XiHikGS4HGMH4CnSwhqWdGQQMqqdvp4Jybm9sE3R1WVnpWVd4SFkc8ryPDBLViNLwiEqECg=="], - "bare-path": ["bare-path@3.0.0", "", { "dependencies": { "bare-os": "^3.0.1" } }, "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw=="], + "bare-path": ["bare-path@3.1.2", "", {}, "sha512-ZyKbsuuqK6Ag0K8pX6V5Txq6XeJRvY+wXucnFGRjiyVYP9YWDpIQugk/b+enRYrEYBJaqLzghRQpXPMR7341Nw=="], - "bare-stream": ["bare-stream@2.13.1", "", { "dependencies": { "streamx": "^2.25.0", "teex": "^1.0.1" }, "peerDependencies": { "bare-abort-controller": "*", "bare-buffer": "*", "bare-events": "*" }, "optionalPeers": ["bare-abort-controller", "bare-buffer", "bare-events"] }, "sha512-Vp0cnjYyrEC4whYTymQ+YZi6pBpfiICZO3cfRG8sy67ZNWe951urv1x4eW1BKNngw3U+3fPYb5JQvHbCtxH7Ow=="], + "bare-stream": ["bare-stream@2.13.4", "", { "dependencies": { "b4a": "^1.8.1", "streamx": "^2.25.0", "teex": "^1.0.1" }, "peerDependencies": { "bare-abort-controller": "*", "bare-buffer": "*", "bare-events": "*" }, "optionalPeers": ["bare-abort-controller", "bare-buffer", "bare-events"] }, "sha512-PcrQ8lVLbiJscNm1Kez+Yp4Gy4AHGcN1lzwjvf5NybWen7VvEgUfyfnXYJ2zNqWnzOfCb1Abq6lH8ti0syQszA=="], - "bare-url": ["bare-url@2.4.3", "", { "dependencies": { "bare-path": "^3.0.0" } }, "sha512-Kccpc7ACfXaxfeInfqKcZtW4pT5YBn1mesc4sCsun6sRwtbJ4h+sNOaksUpYEJUKfN65YWC6Bw2OJEFiKxq8nQ=="], + "bare-url": ["bare-url@2.5.4", "", { "dependencies": { "bare-path": "^3.0.0" } }, "sha512-Gxa7UVWBr0/edU1b+TJhn/AZvMQUj9OGspvYsaTYQrAbZA4BOTZGL3LiZxvD+CeMlDH4juwD84+eTAp/bLYW5g=="], "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="], @@ -413,17 +424,17 @@ "before-after-hook": ["before-after-hook@2.2.3", "", {}, "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ=="], - "bestzip": ["bestzip@3.0.2", "", { "dependencies": { "archiver": "^8.0.0", "glob": "^13.0.6", "which": "^6.0.1", "yargs": "^16.2.0" }, "bin": { "bestzip": "bin/cli.js" } }, "sha512-Zxl7GRh4HQdR4KD/WS+CBrN2aVIs8wa+ozSLrISyxVNG7kl/nragWeHL3vZRfF+UGWO707WjRjboN9CoPBl5kg=="], + "bestzip": ["bestzip@3.0.3", "", { "dependencies": { "archiver": "^8.0.0", "glob": "^13.0.6", "which": "^6.0.1", "yargs": "^16.2.0" }, "bin": { "bestzip": "bin/cli.js" } }, "sha512-3UpGCm+bn1uGuPD0ro2d+jFL7wG+632Lo710L6VmJVubxsw3ED0QrDqH+jxktPg8b+0e92cYO6J2zC5FJ2gyvw=="], "binary-extensions": ["binary-extensions@2.3.0", "", {}, "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw=="], "bl": ["bl@5.1.0", "", { "dependencies": { "buffer": "^6.0.3", "inherits": "^2.0.4", "readable-stream": "^3.4.0" } }, "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ=="], - "body-parser": ["body-parser@1.20.5", "", { "dependencies": { "bytes": "~3.1.2", "content-type": "~1.0.5", "debug": "2.6.9", "depd": "2.0.0", "destroy": "~1.2.0", "http-errors": "~2.0.1", "iconv-lite": "~0.4.24", "on-finished": "~2.4.1", "qs": "~6.15.1", "raw-body": "~2.5.3", "type-is": "~1.6.18", "unpipe": "~1.0.0" } }, "sha512-3grm+/2tUOvu2cjJkvsIxrv/wVpfXQW4PsQHYm7yk4vfpu7Ekl6nEsYBoJUL6qDwZUx8wUhQ8tR2qz+ad9c9OA=="], + "body-parser": ["body-parser@1.20.6", "", { "dependencies": { "bytes": "~3.1.2", "content-type": "~1.0.5", "debug": "2.6.9", "depd": "2.0.0", "destroy": "~1.2.0", "http-errors": "~2.0.1", "iconv-lite": "~0.4.24", "on-finished": "~2.4.1", "qs": "~6.15.1", "raw-body": "~2.5.3", "type-is": "~1.6.18", "unpipe": "~1.0.0" } }, "sha512-p5tAzS57i5MV9fZFDj9LeIiTZEufbSe2eDozP+ElheSUq1m74CRq1jI4mYNDdVs9vQztXFLuk/Gd6BWTdwRJ5g=="], "bottleneck": ["bottleneck@2.19.5", "", {}, "sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw=="], - "brace-expansion": ["brace-expansion@5.0.6", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g=="], + "brace-expansion": ["brace-expansion@5.0.9", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg=="], "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], @@ -447,6 +458,8 @@ "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], + "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], + "camel-case": ["camel-case@4.1.2", "", { "dependencies": { "pascal-case": "^3.1.2", "tslib": "^2.0.3" } }, "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw=="], "capital-case": ["capital-case@1.0.4", "", { "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3", "upper-case-first": "^2.0.2" } }, "sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A=="], @@ -455,7 +468,7 @@ "change-case": ["change-case@4.1.2", "", { "dependencies": { "camel-case": "^4.1.2", "capital-case": "^1.0.4", "constant-case": "^3.0.4", "dot-case": "^3.0.4", "header-case": "^2.0.4", "no-case": "^3.0.4", "param-case": "^3.0.4", "pascal-case": "^3.1.2", "path-case": "^3.0.4", "sentence-case": "^3.0.4", "snake-case": "^3.0.4", "tslib": "^2.0.3" } }, "sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A=="], - "chardet": ["chardet@2.1.1", "", {}, "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ=="], + "chardet": ["chardet@2.2.0", "", {}, "sha512-rddelWYNPRrXq6PtNEN2S3f6t9ILzvqaN5pVgi4kqt9jHQaXIial9PznB5iSPVlQSLNaaH22ItWz3EJtQ10+OA=="], "chokidar": ["chokidar@5.0.0", "", { "dependencies": { "readdirp": "^5.0.0" } }, "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw=="], @@ -489,6 +502,8 @@ "compress-commons": ["compress-commons@7.0.1", "", { "dependencies": { "crc-32": "^1.2.0", "crc32-stream": "^7.0.1", "is-stream": "^4.0.0", "normalize-path": "^3.0.0", "readable-stream": "^4.0.0" } }, "sha512-g0S8KAD8qf4+V//pr3BfB1aBnARLXNz2Gx+jmHU0LEriUuoQUOPOulVquHKTJ8+EAIIO7fhseNDr9wK5Q9FKBQ=="], + "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], + "configstore": ["configstore@7.1.0", "", { "dependencies": { "atomically": "^2.0.3", "dot-prop": "^9.0.0", "graceful-fs": "^4.2.11", "xdg-basedir": "^5.1.0" } }, "sha512-N4oog6YJWbR9kGyXvS7jEykLDXIE2C0ILYqNBZBp9iwiJpoCBWYsuAdW6PPFn6w06jjnC+3JstVvWHO4cZqvRg=="], "constant-case": ["constant-case@3.0.4", "", { "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3", "upper-case": "^2.0.2" } }, "sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ=="], @@ -509,6 +524,8 @@ "core-util-is": ["core-util-is@1.0.3", "", {}, "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="], + "cosmiconfig": ["cosmiconfig@9.0.2", "", { "dependencies": { "env-paths": "^2.2.1", "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", "parse-json": "^5.2.0" }, "peerDependencies": { "typescript": ">=4.9.5" }, "optionalPeers": ["typescript"] }, "sha512-gtTZxTDau1wL7Y7zifc2dd8jHSK/k6BTx/2Xp/BpdlAdnlYWFVt7qhJqgwi7637yRwRQ3qL4ZidbB4I8tA5VOg=="], + "crc-32": ["crc-32@1.2.2", "", { "bin": { "crc32": "bin/crc32.njs" } }, "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ=="], "crc32-stream": ["crc32-stream@7.0.1", "", { "dependencies": { "crc-32": "^1.2.0", "readable-stream": "^4.0.0" } }, "sha512-IBWsY8xznyQrcHn8h4bC8/4ErNke5elzgG8GcqF4RFPw6aHkWWRc7Tgw6upjaTX/CT/yQgqYENkxYsTYN+hW2g=="], @@ -519,6 +536,8 @@ "data-uri-to-buffer": ["data-uri-to-buffer@6.0.2", "", {}, "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw=="], + "date-format": ["date-format@4.0.3", "", {}, "sha512-7P3FyqDcfeznLZp2b+OMitV9Sz2lUnsT87WaTat9nVwqsBkTzPG3lPLNwW3en6F4pHUiWzr6vb8CLhjdK9bcxQ=="], + "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], "decimal.js": ["decimal.js@10.6.0", "", {}, "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg=="], @@ -547,14 +566,20 @@ "devtools-protocol": ["devtools-protocol@0.0.1507524", "", {}, "sha512-OjaNE7qpk6GRTXtqQjAE5bGx6+c4F1zZH0YXtpZQLM92HNXx4zMAaqlKhP4T52DosG6hDW8gPMNhGOF8xbwk/w=="], + "diff": ["diff@3.5.1", "", {}, "sha512-Z3u54A8qGyqFOSr2pk0ijYs8mOE9Qz8kTvtKeBI+upoG9j04Sq+oI7W8zAJiQybDcESET8/uIdHzs0p3k4fZlw=="], + "diff3": ["diff3@0.0.3", "", {}, "sha512-iSq8ngPOt0K53A6eVr4d5Kn6GNrM2nQZtC740pzIriHtn4pOQ2lyzEXQMBeVcWERN0ye7fhBsk9PbLLQOnUx/g=="], + "diverged": ["diverged@0.1.3", "", { "dependencies": { "diff": "^3.5.0", "pixelmatch": "^4.0.2", "pngjs": "^3.3.3", "super-simple-web-server": "^1.0.0" } }, "sha512-W8BLyp4Eo+YW9uQ3F5c9BXDT9ITCARA2CFQVb+v57FWYfkr0XjwNOASZacDCq+syk1i/obZ4BZ3w1qtlRO6hQw=="], + "docker-compose": ["docker-compose@0.24.8", "", { "dependencies": { "yaml": "^2.2.2" } }, "sha512-plizRs/Vf15H+GCVxq2EUvyPK7ei9b/cVesHvjnX4xaXjM9spHe2Ytq0BitndFgvTJ3E3NljPNUEl7BAN43iZw=="], "dot-case": ["dot-case@3.0.4", "", { "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3" } }, "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w=="], "dot-prop": ["dot-prop@9.0.0", "", { "dependencies": { "type-fest": "^4.18.2" } }, "sha512-1gxPBJpI/pcjQhKgIU91II6Wkay+dLcN3M6rf2uwP8hRur3HtQXjVrdAK3sjC0piaEuxzMwjXChcETiJl47lAQ=="], + "dotenv": ["dotenv@17.4.2", "", {}, "sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw=="], + "dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="], "each-props": ["each-props@3.0.0", "", { "dependencies": { "is-plain-object": "^5.0.0", "object.defaults": "^1.1.0" } }, "sha512-IYf1hpuWrdzse/s/YJOrFmU15lyhSzxelNVAHTEG3DtP4QsLTWZUzcUL3HMXmKQxXpa4EIrBPpwRgj0aehdvAw=="], @@ -573,11 +598,15 @@ "enquirer": ["enquirer@2.4.1", "", { "dependencies": { "ansi-colors": "^4.1.1", "strip-ansi": "^6.0.1" } }, "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ=="], + "env-paths": ["env-paths@2.2.1", "", {}, "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A=="], + + "error-ex": ["error-ex@1.3.4", "", { "dependencies": { "is-arrayish": "^0.2.1" } }, "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ=="], + "es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="], "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="], - "es-object-atoms": ["es-object-atoms@1.1.1", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA=="], + "es-object-atoms": ["es-object-atoms@1.1.2", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw=="], "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], @@ -603,7 +632,7 @@ "expand-tilde": ["expand-tilde@2.0.2", "", { "dependencies": { "homedir-polyfill": "^1.0.1" } }, "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw=="], - "express": ["express@4.22.0", "", { "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", "body-parser": "~1.20.3", "content-disposition": "~0.5.4", "content-type": "~1.0.4", "cookie": "~0.7.1", "cookie-signature": "~1.0.6", "debug": "2.6.9", "depd": "2.0.0", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", "finalhandler": "~1.3.1", "fresh": "~0.5.2", "http-errors": "~2.0.0", "merge-descriptors": "1.0.3", "methods": "~1.1.2", "on-finished": "~2.4.1", "parseurl": "~1.3.3", "path-to-regexp": "~0.1.12", "proxy-addr": "~2.0.7", "qs": "~6.14.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", "send": "~0.19.0", "serve-static": "~1.16.2", "setprototypeof": "1.2.0", "statuses": "~2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" } }, "sha512-c2iPh3xp5vvCLgaHK03+mWLFPhox7j1LwyxcZwFVApEv5i0X+IjPpbT50SJJwwLpdBVfp45AkK/v+AFgv/XlfQ=="], + "express": ["express@4.22.2", "", { "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", "body-parser": "~1.20.5", "content-disposition": "~0.5.4", "content-type": "~1.0.4", "cookie": "~0.7.1", "cookie-signature": "~1.0.6", "debug": "2.6.9", "depd": "2.0.0", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", "finalhandler": "~1.3.1", "fresh": "~0.5.2", "http-errors": "~2.0.0", "merge-descriptors": "1.0.3", "methods": "~1.1.2", "on-finished": "~2.4.1", "parseurl": "~1.3.3", "path-to-regexp": "~0.1.12", "proxy-addr": "~2.0.7", "qs": "~6.15.1", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", "send": "~0.19.0", "serve-static": "~1.16.2", "setprototypeof": "1.2.0", "statuses": "~2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" } }, "sha512-IuL+Elrou2ZvCFHs18/CIzy2Nzvo25nZ1/D2eIZlz7c+QUayAcYoiM2BthCjs+EBHVpjYjcuLDAiCWgeIX3X1Q=="], "extend": ["extend@3.0.2", "", {}, "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="], @@ -617,13 +646,15 @@ "fast-levenshtein": ["fast-levenshtein@3.0.0", "", { "dependencies": { "fastest-levenshtein": "^1.0.7" } }, "sha512-hKKNajm46uNmTlhHSyZkmToAc56uZJwYq7yrciZjqOxnlfQwERDQJmHPUp7m1m9wx8vgOe8IaCKZ5Kv2k1DdCQ=="], - "fast-xml-builder": ["fast-xml-builder@1.2.0", "", { "dependencies": { "path-expression-matcher": "^1.5.0", "xml-naming": "^0.1.0" } }, "sha512-00aAWieqff+ZJhsXA4g1g7M8k+7AYoMUUHF+/zFb5U6Uv/P0Vl4QZo84/IcufzYalLuEj9928bXN9PbbFzMF0Q=="], + "fast-uri": ["fast-uri@3.1.7", "", {}, "sha512-dOvZVzjdZdz7phd9v6jCbwxrBW3fK6n8Rc0CtdmM4bumzMnxywBYhuph6J819RRw/ku+rLbelwfMunktuzVVHg=="], + + "fast-xml-builder": ["fast-xml-builder@1.3.1", "", { "dependencies": { "path-expression-matcher": "^1.6.2", "xml-naming": "^0.3.0" } }, "sha512-pIM/1n3ntFXKYrUZwW7QCK0gAW7XY+wzj1YMIV3tLDvPj/V+zTGJK5e3/4WJfwj0qWw2ElNXiTixda/R+3YSug=="], - "fast-xml-parser": ["fast-xml-parser@5.8.0", "", { "dependencies": { "@nodable/entities": "^2.1.0", "fast-xml-builder": "^1.2.0", "path-expression-matcher": "^1.5.0", "strnum": "^2.3.0", "xml-naming": "^0.1.0" }, "bin": { "fxparser": "src/cli/cli.js" } }, "sha512-6bIM7fsJxeo3uXv7OncQYsBAMPJ7V16Slahl/6M98C/i2q+vB1+4a0MtrvYwDFEUrwDSbAmeLDRXsOBwrL7yAg=="], + "fast-xml-parser": ["fast-xml-parser@5.11.1", "", { "dependencies": { "@nodable/entities": "^3.0.0", "fast-xml-builder": "^1.2.0", "is-unsafe": "^2.0.0", "path-expression-matcher": "^1.6.2", "strnum": "^2.4.2", "xml-naming": "^0.3.0" }, "bin": { "fxparser": "src/cli/cli.js" } }, "sha512-TBw6K/fxoQGGjCmZDw9w/ZwP3uDcnTM4YH/g+PFRWr8sbe5idXtxNN6vITh4+1ruCZaho6uBFurElsA7F0zzgw=="], "fastest-levenshtein": ["fastest-levenshtein@1.0.16", "", {}, "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg=="], - "fastq": ["fastq@1.20.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw=="], + "fastq": ["fastq@1.20.3", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-XKv5nnLs6nLF71NgiKJLIZFLkPyIEuOselLG7ujZnGrRfQK8HpvY+WqKhAJUAdLomwVHErVS4LfxFlPq0/FTAw=="], "fd-slicer": ["fd-slicer@1.1.0", "", { "dependencies": { "pend": "~1.2.0" } }, "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g=="], @@ -653,11 +684,13 @@ "fs-ext-extra-prebuilt": ["fs-ext-extra-prebuilt@2.2.7", "", { "dependencies": { "nan": "^2.24.0" } }, "sha512-Q7rayYRBDIvDF01HWOwSSjoaP+05N1g+o3BXL1Zf8Frw2JkjSmi4EtvCBITuW30l6hB2m2TW1pehdh8wyU/+gw=="], - "fs-extra": ["fs-extra@11.1.1", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ=="], + "fs-extra": ["fs-extra@11.4.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-EQsFzMUJkCKGr1ePqlYADkIUmHW1s3ZXr5Yqy6wbGrfUCphpl2maM/kyOIRA2HpP3AaFQTZXD4ldjek+nccddA=="], "fs-mkdirp-stream": ["fs-mkdirp-stream@2.0.1", "", { "dependencies": { "graceful-fs": "^4.2.8", "streamx": "^2.12.0" } }, "sha512-UTOY+59K6IA94tec8Wjqm0FSh5OVudGNB0NL/P6fB3HiE3bYOY3VYBGijsnOHNkQSwC1FKkU77pmq7xp9CskLw=="], - "fsevents": ["fsevents@2.3.2", "", { "os": "darwin" }, "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA=="], + "fs.realpath": ["fs.realpath@1.0.0", "", {}, "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="], + + "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], @@ -717,7 +750,7 @@ "has-tostringtag": ["has-tostringtag@1.0.2", "", { "dependencies": { "has-symbols": "^1.0.3" } }, "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw=="], - "hasown": ["hasown@2.0.3", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg=="], + "hasown": ["hasown@2.0.4", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A=="], "header-case": ["header-case@2.0.4", "", { "dependencies": { "capital-case": "^1.0.4", "tslib": "^2.0.3" } }, "sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q=="], @@ -727,7 +760,7 @@ "http-errors": ["http-errors@2.0.1", "", { "dependencies": { "depd": "~2.0.0", "inherits": "~2.0.4", "setprototypeof": "~1.2.0", "statuses": "~2.0.2", "toidentifier": "~1.0.1" } }, "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ=="], - "http-link-header": ["http-link-header@1.1.3", "", {}, "sha512-3cZ0SRL8fb9MUlU3mKM61FcQvPfXx2dBrZW3Vbg5CXa8jFlK8OaEpePenLe1oEXQduhz8b0QjsqfS59QP4AJDQ=="], + "http-link-header": ["http-link-header@1.1.4", "", {}, "sha512-xT3GPW6/ZbGuw4UvwHqErSCEjNUlwbQJuZn9/q5U4WEKfp2kENVCAlousG1zLxHeaQ/ffOHUNpWamvkbBW0eNw=="], "http-proxy-agent": ["http-proxy-agent@7.0.2", "", { "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" } }, "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig=="], @@ -743,13 +776,17 @@ "image-ssim": ["image-ssim@0.2.0", "", {}, "sha512-W7+sO6/yhxy83L0G7xR8YAc5Z5QFtYEXXRV6EaE8tuYBZJnA3gVgp3q7X7muhLZVodeb9UfvjSbwt9VJwjIYAg=="], - "immutable": ["immutable@5.1.5", "", {}, "sha512-t7xcm2siw+hlUM68I+UEOK+z84RzmN59as9DZ7P1l0994DKUWV7UXBMQZVxaoMSRQ+PBZbHCOoBt7a2wxOMt+A=="], + "immutable": ["immutable@5.1.9", "", {}, "sha512-m8nVez3rwrgmWxtLMt1ZYXB2Lv7OKYn/disyxAlSDYAlKSlFoPPfIAmAM/M5xqL4m4C/wAPw7S2/CNaUii1Hxg=="], + + "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], "import-in-the-middle": ["import-in-the-middle@1.15.0", "", { "dependencies": { "acorn": "^8.14.0", "acorn-import-attributes": "^1.9.5", "cjs-module-lexer": "^1.2.2", "module-details-from-path": "^1.0.3" } }, "sha512-bpQy+CrsRmYmoPMAE/0G33iwRqwW4ouqdRg8jgbH3aKuCtOc8lxgmYXg2dMM92CRiGP660EtBcymH/eVUpCSaA=="], "indent-string": ["indent-string@4.0.0", "", {}, "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg=="], - "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], + "inflight": ["inflight@1.0.6", "", { "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA=="], + + "inherits": ["inherits@2.0.3", "", {}, "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw=="], "ini": ["ini@4.1.2", "", {}, "sha512-AMB1mvwR1pyBFY/nSevUX6y8nJWS63/SzUKD3JyQn97s4xgIdgQPT75IRouIiBAN4yLQBUShNYVW0+UG25daCw=="], @@ -757,12 +794,14 @@ "intl-messageformat": ["intl-messageformat@10.7.18", "", { "dependencies": { "@formatjs/ecma402-abstract": "2.3.6", "@formatjs/fast-memoize": "2.2.7", "@formatjs/icu-messageformat-parser": "2.11.4", "tslib": "^2.8.0" } }, "sha512-m3Ofv/X/tV8Y3tHXLohcuVuhWKo7BBq62cqY15etqmLxg2DZ34AGGgQDeR+SCta2+zICb1NX83af0GJmbQ1++g=="], - "ip-address": ["ip-address@10.2.0", "", {}, "sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA=="], + "ip-address": ["ip-address@10.7.0", "", {}, "sha512-BGFsyJd5mpXp3rK6jIdADLNgpJUK1jnjzvYF8lK+VyDab9JAmqN0YOKDdP17HlgKb2+ehPgDc8EtnRLbGCAMhA=="], "ipaddr.js": ["ipaddr.js@1.9.1", "", {}, "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="], "is-absolute": ["is-absolute@1.0.0", "", { "dependencies": { "is-relative": "^1.0.0", "is-windows": "^1.0.1" } }, "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA=="], + "is-arrayish": ["is-arrayish@0.2.1", "", {}, "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="], + "is-binary-path": ["is-binary-path@2.1.0", "", { "dependencies": { "binary-extensions": "^2.0.0" } }, "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw=="], "is-callable": ["is-callable@1.2.7", "", {}, "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA=="], @@ -785,7 +824,7 @@ "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], - "is-plain-object": ["is-plain-object@5.0.0", "", {}, "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q=="], + "is-plain-object": ["is-plain-object@5.1.0", "", {}, "sha512-bUi/yjmtKYcRVUtWRGr0UA6xEFh2I6zWUwMrUXB3s7bmYCaZ8a+0ZsTRkrawh/mzlSD1Y0Ph8bp/U+TvBpWDNw=="], "is-relative": ["is-relative@1.0.0", "", { "dependencies": { "is-unc-path": "^1.0.0" } }, "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA=="], @@ -795,11 +834,13 @@ "is-unc-path": ["is-unc-path@1.0.0", "", { "dependencies": { "unc-path-regex": "^0.1.2" } }, "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ=="], + "is-unsafe": ["is-unsafe@2.0.2", "", {}, "sha512-HgbIHPBH0KHHCcjLfGsCvhtPTVxjaAZlXjwdz7/GQC40SjSe4sfQsar8J5VFo8JOSbarkpV0OLG95bbaNd9aAQ=="], + "is-valid-glob": ["is-valid-glob@1.0.0", "", {}, "sha512-AhiROmoEFDSsjx8hW+5sGwgKVIORcXnrlAx/R0ZSeaPw70Vw0CqkGBBhHGL58Uox2eXnU1AnvXJl1XlyedO5bA=="], "is-windows": ["is-windows@1.0.2", "", {}, "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA=="], - "is-wsl": ["is-wsl@2.2.0", "", { "dependencies": { "is-docker": "^2.0.0" } }, "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww=="], + "is-wsl": ["is-wsl@1.1.0", "", {}, "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw=="], "isarray": ["isarray@1.0.0", "", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="], @@ -815,10 +856,14 @@ "js-library-detector": ["js-library-detector@6.7.0", "", {}, "sha512-c80Qupofp43y4cJ7+8TTDN/AsDwLi5oOm/plBrWI+iQt485vKXCco+yVmOwEgdo9VOdsYTuV0UlTeetVPTriXA=="], - "js-yaml": ["js-yaml@3.15.1", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-S99WuO3HlhO3XN41EtYUNl9zzXjoJx7QvmipxsJVxtCBT0YHEFy+iOJhjSvrmV12nYhWpZaM8lPHkJm0yUMbag=="], + "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], + + "js-yaml": ["js-yaml@3.15.2", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-6EuL879VkRA+1Cz578mKMiKvjPNEuk6+r1JaFzoSWejZmtf7xWbIyw1e3KkxlkzTIt9Taw6JBhEppG7utc1P+w=="], "json-buffer": ["json-buffer@3.0.1", "", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="], + "json-parse-even-better-errors": ["json-parse-even-better-errors@2.3.1", "", {}, "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="], + "json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], "jsonc-parser": ["jsonc-parser@3.3.1", "", {}, "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ=="], @@ -827,6 +872,10 @@ "jsonwebtoken": ["jsonwebtoken@9.0.3", "", { "dependencies": { "jws": "^4.0.1", "lodash.includes": "^4.3.0", "lodash.isboolean": "^3.0.3", "lodash.isinteger": "^4.0.4", "lodash.isnumber": "^3.0.3", "lodash.isplainobject": "^4.0.6", "lodash.isstring": "^4.0.1", "lodash.once": "^4.0.0", "ms": "^2.1.1", "semver": "^7.5.4" } }, "sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g=="], + "jump.js": ["jump.js@1.0.2", "", {}, "sha512-oUkJJ/Y4ATU5qjkXBntCZSKctbSyS3ewe2jrLaUu/cc9jsQiAn0fnTUxQnZz3mJdDdem1Q279zrD6h3n+Cgxtg=="], + + "junit-report-builder": ["junit-report-builder@3.2.1", "", { "dependencies": { "date-format": "4.0.3", "lodash": "^4.17.21", "make-dir": "^3.1.0", "xmlbuilder": "^15.1.1" } }, "sha512-IMCp5XyDQ4YESDE4Za7im3buM0/7cMnRfe17k2X8B05FnUl9vqnaliX6cgOEmPIeWKfJrEe/gANRq/XgqttCqQ=="], + "jwa": ["jwa@2.0.1", "", { "dependencies": { "buffer-equal-constant-time": "^1.0.1", "ecdsa-sig-formatter": "1.0.11", "safe-buffer": "^5.0.1" } }, "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg=="], "jws": ["jws@4.0.1", "", { "dependencies": { "jwa": "^2.0.1", "safe-buffer": "^5.0.1" } }, "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA=="], @@ -849,6 +898,10 @@ "lighthouse-stack-packs": ["lighthouse-stack-packs@1.12.2", "", {}, "sha512-Ug8feS/A+92TMTCK6yHYLwaFMuelK/hAKRMdldYkMNwv+d9PtWxjXEg6rwKtsUXTADajhdrhXyuNCJ5/sfmPFw=="], + "lines-and-columns": ["lines-and-columns@1.2.4", "", {}, "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="], + + "lodash": ["lodash@4.18.1", "", {}, "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q=="], + "lodash-es": ["lodash-es@4.18.1", "", {}, "sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A=="], "lodash.clonedeep": ["lodash.clonedeep@4.5.0", "", {}, "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ=="], @@ -875,7 +928,9 @@ "lowercase-keys": ["lowercase-keys@2.0.0", "", {}, "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA=="], - "lru-cache": ["lru-cache@11.3.6", "", {}, "sha512-Gf/KoL3C/MlI7Bt0PGI9I+TeTC/I6r/csU58N4BSNc4lppLBeKsOdFYkK+dX0ABDUMJNfCHTyPpzwwO21Awd3A=="], + "lru-cache": ["lru-cache@11.5.2", "", {}, "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g=="], + + "make-dir": ["make-dir@3.1.0", "", { "dependencies": { "semver": "^6.0.0" } }, "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw=="], "make-error": ["make-error@1.3.6", "", {}, "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw=="], @@ -907,7 +962,7 @@ "mimic-response": ["mimic-response@3.1.0", "", {}, "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ=="], - "minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], + "minimatch": ["minimatch@10.2.6", "", { "dependencies": { "brace-expansion": "^5.0.8" } }, "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A=="], "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="], @@ -917,6 +972,8 @@ "mitt": ["mitt@3.0.1", "", {}, "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw=="], + "mkdirp": ["mkdirp@0.5.6", "", { "dependencies": { "minimist": "^1.2.6" }, "bin": { "mkdirp": "bin/cmd.js" } }, "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw=="], + "module-details-from-path": ["module-details-from-path@1.0.4", "", {}, "sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w=="], "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], @@ -925,7 +982,7 @@ "mute-stream": ["mute-stream@0.0.8", "", {}, "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA=="], - "nan": ["nan@2.27.0", "", {}, "sha512-hC+0LidcL3XE4rp1C4H54KujgXKzbfyTngZTwBByQxsOxCEKZT0MPQ4hOKUH2jU1OYstqdDH4onyHPDzcV0XdQ=="], + "nan": ["nan@2.28.0", "", {}, "sha512-fTsDz99OTq2sVePhGdp4qQhggZFtKr64ZNVyVajRKtMOkJxYekplBh577PiJB12v/D3s2E5cGtOI45LWp6rnLQ=="], "negotiator": ["negotiator@0.6.3", "", {}, "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="], @@ -941,6 +998,8 @@ "now-and-later": ["now-and-later@3.0.0", "", { "dependencies": { "once": "^1.4.0" } }, "sha512-pGO4pzSdaxhWTGkfSfHx3hVzJVslFPwBp2Myq9MYN/ChfJZF87ochMAXnvz6/58RJSf5ik2q9tXprBBrk2cpcg=="], + "object-hash": ["object-hash@3.0.0", "", {}, "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw=="], + "object-inspect": ["object-inspect@1.13.4", "", {}, "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew=="], "object.defaults": ["object.defaults@1.1.0", "", { "dependencies": { "array-each": "^1.0.1", "array-slice": "^1.0.0", "for-own": "^1.0.0", "isobject": "^3.0.0" } }, "sha512-c/K0mw/F11k4dEUBMW8naXUuBuhxRCfG7W+yFy8EcijU/rSmazOUd1XAEEe6bC0OuXY4HUKjTJv7xbxIMqdxrA=="], @@ -957,10 +1016,16 @@ "open": ["open@8.4.2", "", { "dependencies": { "define-lazy-prop": "^2.0.0", "is-docker": "^2.1.1", "is-wsl": "^2.2.0" } }, "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ=="], + "opn": ["opn@6.0.0", "", { "dependencies": { "is-wsl": "^1.1.0" } }, "sha512-I9PKfIZC+e4RXZ/qr1RhgyCnGgYX0UEIlXgWnCOVACIvFgaC9rz6Won7xbdhoHrd8IIhV7YEpHjreNUNkqCGkQ=="], + "ora": ["ora@4.1.1", "", { "dependencies": { "chalk": "^3.0.0", "cli-cursor": "^3.1.0", "cli-spinners": "^2.2.0", "is-interactive": "^1.0.0", "log-symbols": "^3.0.0", "mute-stream": "0.0.8", "strip-ansi": "^6.0.0", "wcwidth": "^1.0.1" } }, "sha512-sjYP8QyVWBpBZWD6Vr1M/KwknSw6kJOz41tvGMlwWeClHBtYKTbHMki1PsLZnxKpXMPbTKv9b3pjQu3REib96A=="], + "os": ["os@0.1.2", "", {}, "sha512-ZoXJkvAnljwvc56MbvhtKVWmSkzV712k42Is2mA0+0KTSRakq5XXuXpjZjgAt9ctzl51ojhQWakQQpmOvXWfjQ=="], + "p-cancelable": ["p-cancelable@2.1.1", "", {}, "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg=="], + "p-map": ["p-map@4.0.0", "", { "dependencies": { "aggregate-error": "^3.0.0" } }, "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ=="], + "pac-proxy-agent": ["pac-proxy-agent@7.2.0", "", { "dependencies": { "@tootallnate/quickjs-emscripten": "^0.23.0", "agent-base": "^7.1.2", "debug": "^4.3.4", "get-uri": "^6.0.1", "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.6", "pac-resolver": "^7.0.1", "socks-proxy-agent": "^8.0.5" } }, "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA=="], "pac-resolver": ["pac-resolver@7.0.1", "", { "dependencies": { "degenerator": "^5.0.0", "netmask": "^2.0.2" } }, "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg=="], @@ -971,19 +1036,27 @@ "param-case": ["param-case@3.0.4", "", { "dependencies": { "dot-case": "^3.0.4", "tslib": "^2.0.3" } }, "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A=="], + "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], + "parse-cache-control": ["parse-cache-control@1.0.1", "", {}, "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg=="], "parse-filepath": ["parse-filepath@1.0.2", "", { "dependencies": { "is-absolute": "^1.0.0", "map-cache": "^0.2.0", "path-root": "^0.1.1" } }, "sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q=="], + "parse-json": ["parse-json@5.2.0", "", { "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" } }, "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg=="], + "parse-passwd": ["parse-passwd@1.0.0", "", {}, "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q=="], "parseurl": ["parseurl@1.3.3", "", {}, "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="], "pascal-case": ["pascal-case@3.1.2", "", { "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3" } }, "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g=="], + "path": ["path@0.12.7", "", { "dependencies": { "process": "^0.11.1", "util": "^0.10.3" } }, "sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q=="], + "path-case": ["path-case@3.0.4", "", { "dependencies": { "dot-case": "^3.0.4", "tslib": "^2.0.3" } }, "sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg=="], - "path-expression-matcher": ["path-expression-matcher@1.5.0", "", {}, "sha512-cbrerZV+6rvdQrrD+iGMcZFEiiSrbv9Tfdkvnusy6y0x0GKBXREFg/Y65GhIfm0tnLntThhzCnfKwp1WRjeCyQ=="], + "path-expression-matcher": ["path-expression-matcher@1.6.2", "", {}, "sha512-enSlaiat05iasnzmgNxRj8reFdj3puY2QpNgP1aPIaVfT6nn9ICuPoFlKHk8EN22HcwewshO+mN2DGbkCEOtqQ=="], + + "path-is-absolute": ["path-is-absolute@1.0.1", "", {}, "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg=="], "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], @@ -1001,22 +1074,28 @@ "pg-int8": ["pg-int8@1.0.1", "", {}, "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw=="], - "pg-protocol": ["pg-protocol@1.13.0", "", {}, "sha512-zzdvXfS6v89r6v7OcFCHfHlyG/wvry1ALxZo4LqgUoy7W9xhBDMaqOuMiF3qEV45VqsN6rdlcehHrfDtlCPc8w=="], + "pg-protocol": ["pg-protocol@1.16.0", "", {}, "sha512-sILXutLVjCLjcDuOmvhX5e2Z4cS5qG/6Bu3VkpFwdf/633ElGLpEh9bgmuI5I4sqKqkifQiGyiCcx1HdtrK7tg=="], "pg-types": ["pg-types@2.2.0", "", { "dependencies": { "pg-int8": "1.0.1", "postgres-array": "~2.0.0", "postgres-bytea": "~1.0.0", "postgres-date": "~1.0.4", "postgres-interval": "^1.1.0" } }, "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA=="], "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], - "picomatch": ["picomatch@4.0.4", "", {}, "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A=="], + "picomatch": ["picomatch@4.0.7", "", {}, "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA=="], "pify": ["pify@4.0.1", "", {}, "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g=="], - "playwright": ["playwright@1.62.1", "", { "dependencies": { "playwright-core": "1.62.1" }, "optionalDependencies": { "fsevents": "2.3.2" }, "bin": { "playwright": "cli.js" } }, "sha512-0M+L3LAD8/nm554LOla9Ayx0j0tmFZ0FBcoQ7F1VuVHpM/XpiC8RcDzBQB8W5+hA8L22THxELzeF+2WcUzvcLg=="], + "pixelmatch": ["pixelmatch@4.0.2", "", { "dependencies": { "pngjs": "^3.0.0" }, "bin": { "pixelmatch": "bin/pixelmatch" } }, "sha512-J8B6xqiO37sU/gkcMglv6h5Jbd9xNER7aHzpfRdNmV4IbQBzBpe4l9XmbG+xPF/znacgu2jfEw+wHffaq/YkXA=="], + + "playwright": ["playwright@1.63.0", "", { "dependencies": { "playwright-core": "1.63.0" }, "bin": { "playwright": "cli.js" } }, "sha512-+7ziBLidS4NaNCdt57SUDT+wYmmd5fmiQejUic/kb+YsYSCPyOOE9sebzMjNmQrsnNpDJqd4WHvV/8lfKfUDUg=="], "playwright-core": ["playwright-core@1.62.1", "", { "bin": { "playwright-core": "cli.js" } }, "sha512-wPYSwEBJY9GHraISXqyqtx0na0LpO3XEX7jNDhntbex7tzUS7kLnZsOlFruFJB4Hi/rhDMjXGqHewDZ68nYZVw=="], "plugin-error": ["plugin-error@1.0.1", "", { "dependencies": { "ansi-colors": "^1.0.1", "arr-diff": "^4.0.0", "arr-union": "^3.1.0", "extend-shallow": "^3.0.2" } }, "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA=="], + "pngjs": ["pngjs@6.0.0", "", {}, "sha512-TRzzuFRRmEoSW/p1KVAmiOgPco2Irlah+bGFCeNfJXxxYGwSw7YwAOAcd7X28K/m5bjBWKsC29KyoMfHbypayg=="], + + "portfinder": ["portfinder@1.0.38", "", { "dependencies": { "async": "^3.2.6", "debug": "^4.3.6" } }, "sha512-rEwq/ZHlJIKw++XtLAO8PPuOQA/zaPJOZJ37BVuN97nLpMJeuDVLVGRwbFoBgLudgdTMP2hdRJP++H+8QOA3vg=="], + "possible-typed-array-names": ["possible-typed-array-names@1.1.0", "", {}, "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg=="], "postgres-array": ["postgres-array@2.0.0", "", {}, "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA=="], @@ -1041,11 +1120,11 @@ "pump": ["pump@3.0.4", "", { "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA=="], - "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], + "puppeteer": ["puppeteer@22.15.0", "", { "dependencies": { "@puppeteer/browsers": "2.3.0", "cosmiconfig": "^9.0.0", "devtools-protocol": "0.0.1312386", "puppeteer-core": "22.15.0" }, "bin": { "puppeteer": "lib/esm/puppeteer/node/cli.js" } }, "sha512-XjCY1SiSEi1T7iSYuxS82ft85kwDJUS7wj1Z0eGVXKdtr5g4xnVcbjwxhq5xBnpK/E7x1VZZoJDxpjAOasHT4Q=="], "puppeteer-core": ["puppeteer-core@24.43.1", "", { "dependencies": { "@puppeteer/browsers": "2.13.2", "chromium-bidi": "14.0.0", "debug": "^4.4.3", "devtools-protocol": "0.0.1608973", "typed-query-selector": "^2.12.2", "webdriver-bidi-protocol": "0.4.1", "ws": "^8.20.0" } }, "sha512-T5ScUMAsmhdNbgDR41AGESYeS6V9MSgetkSnVhhW+gXvzC42VesKCn5ld87gAZDJ6vLHL9GkRvY9WtQWSnwFbw=="], - "qs": ["qs@6.14.2", "", { "dependencies": { "side-channel": "^1.1.0" } }, "sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q=="], + "qs": ["qs@6.15.3", "", { "dependencies": { "es-define-property": "^1.0.1", "side-channel": "^1.1.1" } }, "sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A=="], "quick-lru": ["quick-lru@5.1.1", "", {}, "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA=="], @@ -1057,7 +1136,7 @@ "readdir-glob": ["readdir-glob@3.0.0", "", { "dependencies": { "minimatch": "^10.2.2" } }, "sha512-AhNB2KgKeVJr16nK9LLZbJNWnYoT23ZrumNKFDebHBdkC8KHSqWo871JAUhoWC/RtjEVdqNMFpM6qrwRbaUqpw=="], - "readdirp": ["readdirp@5.0.0", "", {}, "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ=="], + "readdirp": ["readdirp@5.1.1", "", {}, "sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA=="], "rechoir": ["rechoir@0.8.0", "", { "dependencies": { "resolve": "^1.20.0" } }, "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ=="], @@ -1079,6 +1158,8 @@ "resolve-dir": ["resolve-dir@1.0.1", "", { "dependencies": { "expand-tilde": "^2.0.0", "global-modules": "^1.0.0" } }, "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg=="], + "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], + "resolve-options": ["resolve-options@2.0.0", "", { "dependencies": { "value-or-function": "^4.0.0" } }, "sha512-/FopbmmFOQCfsCx77BRFdKOniglTiHumLgwvd6IDPihy1GKkadZbgQJBcTb2lMzSR1pndzd96b1nZrreZ7+9/A=="], "responselike": ["responselike@2.0.1", "", { "dependencies": { "lowercase-keys": "^2.0.0" } }, "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw=="], @@ -1095,11 +1176,11 @@ "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="], - "sass": ["sass@1.102.0", "", { "dependencies": { "chokidar": "^5.0.0", "immutable": "^5.1.5", "source-map-js": ">=0.6.2 <2.0.0" }, "optionalDependencies": { "@parcel/watcher": "^2.4.1" }, "bin": { "sass": "sass.js" } }, "sha512-NSOyTnaQF7rTAEOtI2fwb386vL+akyiQLBZu8Na7hXCb+umJy0GAqlcMIaqACZ6Z1VgTBS4K9PG6B3IdjHGJsw=="], + "sass": ["sass@1.104.0", "", { "dependencies": { "chokidar": "^5.0.0", "immutable": "^5.1.5", "source-map-js": ">=0.6.2 <2.0.0" }, "optionalDependencies": { "@parcel/watcher": "^2.4.1" }, "bin": { "sass": "sass.js" } }, "sha512-btHMApW2bgolvClhRW8AlQJzgI9lUB3pPSofBQQT+E46GWvf9o0TVQ13SYv5riWZVFyPN+JNz3TKW9XhBlc10w=="], - "sax": ["sax@1.6.0", "", {}, "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA=="], + "sax": ["sax@1.6.1", "", {}, "sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q=="], - "semver": ["semver@7.8.0", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA=="], + "semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], "semver-greatest-satisfied-range": ["semver-greatest-satisfied-range@2.0.0", "", { "dependencies": { "sver": "^1.8.3" } }, "sha512-lH3f6kMbwyANB7HuOWRMlLCa2itaCrZJ+SAqqkSZrZKO/cAsk2EOyaKHUtNkVLFyFW9pct22SFesFp3Z7zpA0g=="], @@ -1121,7 +1202,7 @@ "shimmer": ["shimmer@1.2.1", "", {}, "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw=="], - "side-channel": ["side-channel@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", "side-channel-list": "^1.0.0", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" } }, "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw=="], + "side-channel": ["side-channel@1.1.1", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.4", "side-channel-list": "^1.0.1", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" } }, "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ=="], "side-channel-list": ["side-channel-list@1.0.1", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.4" } }, "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w=="], @@ -1141,7 +1222,7 @@ "snake-case": ["snake-case@3.0.4", "", { "dependencies": { "dot-case": "^3.0.4", "tslib": "^2.0.3" } }, "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg=="], - "socks": ["socks@2.8.9", "", { "dependencies": { "ip-address": "^10.1.1", "smart-buffer": "^4.2.0" } }, "sha512-LJhUYUvItdQ0LkJTmPeaEObWXAqFyfmP85x0tch/ez9cahmhlBBLbIqDFnvBnUJGagb0JbIQrkBs1wJ+yRYpEw=="], + "socks": ["socks@2.8.10", "", { "dependencies": { "ip-address": "^10.1.1", "smart-buffer": "^4.2.0" } }, "sha512-e0VyvkVTwVYViNovRkZ9aodhxVlyoMn7eJhVUPxZ+eK9P/7CBkxvvsBOHqFPEH416726W8tLXXXjKwqgTErrCQ=="], "socks-proxy-agent": ["socks-proxy-agent@8.0.5", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "^4.3.4", "socks": "^2.8.3" } }, "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw=="], @@ -1161,7 +1242,7 @@ "stream-exhaust": ["stream-exhaust@1.0.2", "", {}, "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw=="], - "streamx": ["streamx@2.25.0", "", { "dependencies": { "events-universal": "^1.0.0", "fast-fifo": "^1.3.2", "text-decoder": "^1.1.0" } }, "sha512-0nQuG6jf1w+wddNEEXCF4nTg3LtufWINB5eFEN+5TNZW7KWJp6x87+JFL43vaAUPyCfH1wID+mNVyW6OHtFamg=="], + "streamx": ["streamx@2.28.1", "", { "dependencies": { "events-universal": "^1.0.0", "fast-fifo": "^1.3.2", "text-decoder": "^1.1.0" } }, "sha512-zEzXb0s5Cds7tqMH6rhZ05lcJydCWiQPEwiNngVqzsxCc962vLY4Uw+mW7od8kDH258k2Uz/JrOkdIAAhSh9VA=="], "string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], @@ -1173,35 +1254,41 @@ "strip-ansi-cjs": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - "strnum": ["strnum@2.3.0", "", {}, "sha512-ums3KNd42PGyx5xaoVTO1mjU1bH3NpY4vsrVlnv9PNGqQj8wd7rJ6nEypLrJ7z5vxK5RP0yMLo6J/Gsm62DI5Q=="], + "strnum": ["strnum@2.4.2", "", { "dependencies": { "anynum": "^1.0.1" } }, "sha512-rDG3Ah4TV0k1hWvLSzkZtMmLN9+eS+h3knq4MP6A42Y3Yh5qGNnOUs1jJkoSr8FG5dsL28c7KgkIBzSEykqtuw=="], "stubborn-fs": ["stubborn-fs@2.0.0", "", { "dependencies": { "stubborn-utils": "^1.0.1" } }, "sha512-Y0AvSwDw8y+nlSNFXMm2g6L51rBGdAQT20J3YSOqxC53Lo3bjWRtr2BKcfYoAf352WYpsZSTURrA0tqhfgudPA=="], "stubborn-utils": ["stubborn-utils@1.0.2", "", {}, "sha512-zOh9jPYI+xrNOyisSelgym4tolKTJCQd5GBhK0+0xJvcYDcwlOoxF/rnFKQ2KRZknXSG9jWAp66fwP6AxN9STg=="], + "super-simple-web-server": ["super-simple-web-server@1.1.4", "", { "dependencies": { "express": "^4.16.3" } }, "sha512-sQdVXz8ZDBMloocL63mifyVVzhxP55MlO2F0MiYJAJQiHTp42M2C3m2dZBIxGkcC7NUDr1/p0UhvGQvOsxZLpw=="], + "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], "sver": ["sver@1.8.4", "", { "optionalDependencies": { "semver": "^6.3.0" } }, "sha512-71o1zfzyawLfIWBOmw8brleKyvnbn73oVHNCsu51uPMz/HWiKkkXsI31JjHW5zqXEqnPYkIiHd8ZmL7FCimLEA=="], - "tar-fs": ["tar-fs@3.1.2", "", { "dependencies": { "pump": "^3.0.0", "tar-stream": "^3.1.5" }, "optionalDependencies": { "bare-fs": "^4.0.1", "bare-path": "^3.0.0" } }, "sha512-QGxxTxxyleAdyM3kpFs14ymbYmNFrfY+pHj7Z8FgtbZ7w2//VAgLMac7sT6nRpIHjppXO2AwwEOg0bPFVRcmXw=="], + "tar-fs": ["tar-fs@3.1.3", "", { "dependencies": { "pump": "^3.0.0", "tar-stream": "^3.1.5" }, "optionalDependencies": { "bare-fs": "^4.0.1", "bare-path": "^3.0.0" } }, "sha512-/hU4AXnIdZu+Gvl1pk0oI5f5HxWsCJRtY2aFaJdk9VvyL48DWU6iU5WAIPG+wIi1YvWA6eTJvIviP/tMAZZNwQ=="], - "tar-stream": ["tar-stream@3.2.0", "", { "dependencies": { "b4a": "^1.6.4", "bare-fs": "^4.5.5", "fast-fifo": "^1.2.0", "streamx": "^2.15.0" } }, "sha512-ojzvCvVaNp6aOTFmG7jaRD0meowIAuPc3cMMhSgKiVWws1GyHbGd/xvnyuRKcKlMpt3qvxx6r0hreCNITP9hIg=="], + "tar-stream": ["tar-stream@3.2.1", "", { "dependencies": { "b4a": "^1.6.4", "bare-fs": "^4.5.5", "fast-fifo": "^1.2.0", "streamx": "^2.15.0" } }, "sha512-nqsEO8zLZJvrOMdEwkA0QdCLFbetHMn95Zqu4fKwX+hkaTWJPZZOrxx/PwtxoK0MMGQmBQNRW3CPs8IFYQz4cQ=="], "teex": ["teex@1.0.1", "", { "dependencies": { "streamx": "^2.12.5" } }, "sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg=="], + "temp": ["temp@0.9.4", "", { "dependencies": { "mkdirp": "^0.5.1", "rimraf": "~2.6.2" } }, "sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA=="], + "text-decoder": ["text-decoder@1.2.7", "", { "dependencies": { "b4a": "^1.6.4" } }, "sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ=="], "third-party-web": ["third-party-web@0.27.0", "", {}, "sha512-h0JYX+dO2Zr3abCQpS6/uFjujaOjA1DyDzGQ41+oFn9VW/ARiq9g5ln7qEP9+BTzDpOMyIfsfj4OvfgXAsMUSA=="], + "through": ["through@2.3.8", "", {}, "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg=="], + "through2": ["through2@3.0.1", "", { "dependencies": { "readable-stream": "2 || 3" } }, "sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww=="], - "tldts-core": ["tldts-core@7.0.30", "", {}, "sha512-uiHN8PIB1VmWyS98eZYja4xzlYqeFZVjb4OuYlJQnZAuJhMw4PbKQOKgHKhBdJR3FE/t5mUQ1Kd80++B+qhD1Q=="], + "tldts-core": ["tldts-core@7.4.11", "", {}, "sha512-CW3WN2rIIE/Of21mulhgnGOwoDyEFNygyIBOONSdyAuSATgMMUCpLeUlB+E8sAwA5xRV9hYPl+kyZ9citHCaKg=="], - "tldts-icann": ["tldts-icann@7.0.30", "", { "dependencies": { "tldts-core": "^7.0.30" } }, "sha512-o+sKcCCZQOh78GHfpmlcKoef0c+UVfltkqmgKmUHWiMiUhSfer8k5mEkQL2RBqwuC90fluI7ZN50H7+I2bJ1jw=="], + "tldts-icann": ["tldts-icann@7.4.11", "", { "dependencies": { "tldts-core": "^7.4.11" } }, "sha512-1p+NDJ7FUYCliESmsQl9EW5Um8JIyFheiy6Y6ZoHho27d+TLAGFa0gMf1VOVy02vNY1aQo6xeKiaGj45+7P+PA=="], - "tmp": ["tmp@0.2.5", "", {}, "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow=="], + "tmp": ["tmp@0.2.7", "", {}, "sha512-e0votIpp4Uo2AJYSzVHV6xCcawuiez3DzqDAbrTc3YxBkplN6e+dM13ZeIcZnDg/QpSuU2zfZ3rzwY8ukEnaXw=="], "tmp-promise": ["tmp-promise@3.0.3", "", { "dependencies": { "tmp": "^0.2.0" } }, "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ=="], @@ -1225,6 +1312,8 @@ "uglify-js": ["uglify-js@3.19.3", "", { "bin": { "uglifyjs": "bin/uglifyjs" } }, "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ=="], + "unbzip2-stream": ["unbzip2-stream@1.4.3", "", { "dependencies": { "buffer": "^5.2.1", "through": "^2.3.8" } }, "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg=="], + "unc-path-regex": ["unc-path-regex@0.1.2", "", {}, "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg=="], "undertaker": ["undertaker@2.0.0", "", { "dependencies": { "bach": "^2.0.1", "fast-levenshtein": "^3.0.0", "last-run": "^2.0.0", "undertaker-registry": "^2.0.0" } }, "sha512-tO/bf30wBbTsJ7go80j0RzA2rcwX6o7XPBpeFcb+jzoeb4pfMM2zUeSDIkY1AWqeZabWxaQZ/h8N9t35QKDLPQ=="], @@ -1245,7 +1334,9 @@ "upper-case-first": ["upper-case-first@2.0.2", "", { "dependencies": { "tslib": "^2.0.3" } }, "sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg=="], - "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="], + "urlpattern-polyfill": ["urlpattern-polyfill@10.0.0", "", {}, "sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg=="], + + "util": ["util@0.10.4", "", { "dependencies": { "inherits": "2.0.3" } }, "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A=="], "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], @@ -1279,7 +1370,7 @@ "which": ["which@6.0.1", "", { "dependencies": { "isexe": "^4.0.0" }, "bin": { "node-which": "bin/which.js" } }, "sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg=="], - "which-typed-array": ["which-typed-array@1.1.20", "", { "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.4", "for-each": "^0.3.5", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" } }, "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg=="], + "which-typed-array": ["which-typed-array@1.1.22", "", { "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.9", "call-bound": "^1.0.4", "for-each": "^0.3.5", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" } }, "sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw=="], "wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], @@ -1287,15 +1378,15 @@ "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="], - "ws": ["ws@7.5.10", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ=="], + "ws": ["ws@7.5.13", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-rsKI6xDBFVf4r/x8XyChGK04QR/XHroxs/jUcoWvtEZM8TPU/X/uIY9B1CsSzYws9ZJb/6bbBu7dPhFW00CAoA=="], "xdg-basedir": ["xdg-basedir@5.1.0", "", {}, "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ=="], - "xml-naming": ["xml-naming@0.1.0", "", {}, "sha512-k8KO9hrMyNk6tUWqUfkTEZbezRRpONVOzUTnc97VnCvyj6Tf9lyUR9EDAIeiVLv56jsMcoXEwjW8Kv5yPY52lw=="], + "xml-naming": ["xml-naming@0.3.0", "", {}, "sha512-ghig2TBE/H11aOVgmahA3MhimvkBr6JIYknH/Dhdk10nXwdbIqBJsbfMxpvFPG8bAw77gN29aQWvKpmVoPlvPQ=="], "xml2js": ["xml2js@0.6.2", "", { "dependencies": { "sax": ">=0.6.0", "xmlbuilder": "~11.0.0" } }, "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA=="], - "xmlbuilder": ["xmlbuilder@11.0.1", "", {}, "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA=="], + "xmlbuilder": ["xmlbuilder@15.1.1", "", {}, "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg=="], "xtend": ["xtend@4.0.2", "", {}, "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="], @@ -1303,7 +1394,7 @@ "yaml": ["yaml@2.9.0", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA=="], - "yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], + "yargs": ["yargs@17.7.3", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g=="], "yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], @@ -1315,11 +1406,13 @@ "zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], + "zstddec": ["zstddec@0.2.0", "", {}, "sha512-oyPnDa1X5c13+Y7mA/FDMNJrn4S8UNBe0KCqtDmor40Re7ALrPN6npFwyYVRRh+PqozZQdeg23QtbcamZnG5rA=="], + "@inquirer/core/mute-stream": ["mute-stream@2.0.0", "", {}, "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA=="], "@inquirer/core/wrap-ansi": ["wrap-ansi@6.2.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA=="], - "@inquirer/external-editor/iconv-lite": ["iconv-lite@0.7.2", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw=="], + "@inquirer/external-editor/iconv-lite": ["iconv-lite@0.7.3", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ=="], "@isaacs/cliui/string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="], @@ -1353,41 +1446,39 @@ "@opentelemetry/core/@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.28.0", "", {}, "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA=="], + "@opentelemetry/instrumentation/semver": ["semver@7.8.5", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA=="], + "@opentelemetry/instrumentation-http/@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.28.0", "", {}, "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA=="], + "@opentelemetry/instrumentation-http/semver": ["semver@7.8.5", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA=="], + "@opentelemetry/resources/@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.28.0", "", {}, "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA=="], "@opentelemetry/sdk-trace-base/@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.28.0", "", {}, "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA=="], "@paulirish/trace_engine/third-party-web": ["third-party-web@0.29.2", "", {}, "sha512-fegtha91tq2DHphyoiBXVHjVi2YG9zFaRnboT9C28tO1en9Y3wJsfspuy40F+u5wl3hHVbw7cnd1b67kEGHb8g=="], - "@php-wasm/node/ws": ["ws@8.18.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw=="], - - "@php-wasm/xdebug-bridge/ws": ["ws@8.18.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw=="], + "@php-wasm/node/ws": ["ws@8.21.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g=="], - "@sentry/node/minimatch": ["minimatch@9.0.9", "", { "dependencies": { "brace-expansion": "^2.0.2" } }, "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg=="], - - "@types/cacheable-request/@types/node": ["@types/node@25.8.0", "", { "dependencies": { "undici-types": ">=7.24.0 <7.24.7" } }, "sha512-TCFSk8IZh+iLX1xtksoBVtdmgL+1IX0fC9BeU4QqFSuNdN/K+HUlhqOzEmSYYpZUVsLYcPqc9KX+60iDuninSQ=="], - - "@types/connect/@types/node": ["@types/node@25.8.0", "", { "dependencies": { "undici-types": ">=7.24.0 <7.24.7" } }, "sha512-TCFSk8IZh+iLX1xtksoBVtdmgL+1IX0fC9BeU4QqFSuNdN/K+HUlhqOzEmSYYpZUVsLYcPqc9KX+60iDuninSQ=="], + "@php-wasm/xdebug-bridge/ws": ["ws@8.21.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g=="], - "@types/jsonwebtoken/@types/node": ["@types/node@25.8.0", "", { "dependencies": { "undici-types": ">=7.24.0 <7.24.7" } }, "sha512-TCFSk8IZh+iLX1xtksoBVtdmgL+1IX0fC9BeU4QqFSuNdN/K+HUlhqOzEmSYYpZUVsLYcPqc9KX+60iDuninSQ=="], + "@php-wasm/xdebug-bridge/yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], - "@types/keyv/@types/node": ["@types/node@25.8.0", "", { "dependencies": { "undici-types": ">=7.24.0 <7.24.7" } }, "sha512-TCFSk8IZh+iLX1xtksoBVtdmgL+1IX0fC9BeU4QqFSuNdN/K+HUlhqOzEmSYYpZUVsLYcPqc9KX+60iDuninSQ=="], + "@puppeteer/browsers/semver": ["semver@7.8.5", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA=="], - "@types/mysql/@types/node": ["@types/node@25.8.0", "", { "dependencies": { "undici-types": ">=7.24.0 <7.24.7" } }, "sha512-TCFSk8IZh+iLX1xtksoBVtdmgL+1IX0fC9BeU4QqFSuNdN/K+HUlhqOzEmSYYpZUVsLYcPqc9KX+60iDuninSQ=="], - - "@types/pg/@types/node": ["@types/node@25.8.0", "", { "dependencies": { "undici-types": ">=7.24.0 <7.24.7" } }, "sha512-TCFSk8IZh+iLX1xtksoBVtdmgL+1IX0fC9BeU4QqFSuNdN/K+HUlhqOzEmSYYpZUVsLYcPqc9KX+60iDuninSQ=="], + "@sentry/node/minimatch": ["minimatch@9.0.9", "", { "dependencies": { "brace-expansion": "^2.0.2" } }, "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg=="], - "@types/responselike/@types/node": ["@types/node@25.8.0", "", { "dependencies": { "undici-types": ">=7.24.0 <7.24.7" } }, "sha512-TCFSk8IZh+iLX1xtksoBVtdmgL+1IX0fC9BeU4QqFSuNdN/K+HUlhqOzEmSYYpZUVsLYcPqc9KX+60iDuninSQ=="], + "@types/pg-pool/@types/pg": ["@types/pg@8.23.1", "", { "dependencies": { "@types/node": "*", "pg-protocol": "*", "pg-types": "^2.2.0" } }, "sha512-fKVHpikPdg4GKks3JuLEhvwSyvwzF23hnabPy6DD8ljVbC7+6J5dQzdv4arV6jqq57djnMgs1HKBxX4P8aBI3A=="], - "@types/tedious/@types/node": ["@types/node@25.8.0", "", { "dependencies": { "undici-types": ">=7.24.0 <7.24.7" } }, "sha512-TCFSk8IZh+iLX1xtksoBVtdmgL+1IX0fC9BeU4QqFSuNdN/K+HUlhqOzEmSYYpZUVsLYcPqc9KX+60iDuninSQ=="], + "@wp-playground/cli/fs-extra": ["fs-extra@11.1.1", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ=="], - "@types/yauzl/@types/node": ["@types/node@25.8.0", "", { "dependencies": { "undici-types": ">=7.24.0 <7.24.7" } }, "sha512-TCFSk8IZh+iLX1xtksoBVtdmgL+1IX0fC9BeU4QqFSuNdN/K+HUlhqOzEmSYYpZUVsLYcPqc9KX+60iDuninSQ=="], + "@wp-playground/cli/yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], "anymatch/picomatch": ["picomatch@2.3.2", "", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="], - "bestzip/yargs": ["yargs@16.2.0", "", { "dependencies": { "cliui": "^7.0.2", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.0", "y18n": "^5.0.5", "yargs-parser": "^20.2.2" } }, "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw=="], + "bestzip/yargs": ["yargs@16.2.2", "", { "dependencies": { "cliui": "^7.0.2", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.0", "y18n": "^5.0.5", "yargs-parser": "^20.2.2" } }, "sha512-Nt9ZJjXTv5R8MHbqby/wXQ6Gi0Bb3TcYZkR1bzuL4yB2OxWPkXknz513gEF0GoA6tn00UpbPvERW8rzCuWCA6w=="], + + "bl/inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], "bl/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], @@ -1395,16 +1486,18 @@ "body-parser/iconv-lite": ["iconv-lite@0.4.24", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3" } }, "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA=="], - "body-parser/qs": ["qs@6.15.1", "", { "dependencies": { "side-channel": "^1.1.0" } }, "sha512-6YHEFRL9mfgcAvql/XhwTvf5jKcOiiupt2FiJxHkiX1z4j7WL8J/jRHYLluORvc1XxB5rV20KoeK00gVJamspg=="], - - "chrome-launcher/@types/node": ["@types/node@25.8.0", "", { "dependencies": { "undici-types": ">=7.24.0 <7.24.7" } }, "sha512-TCFSk8IZh+iLX1xtksoBVtdmgL+1IX0fC9BeU4QqFSuNdN/K+HUlhqOzEmSYYpZUVsLYcPqc9KX+60iDuninSQ=="], + "chrome-launcher/is-wsl": ["is-wsl@2.2.0", "", { "dependencies": { "is-docker": "^2.0.0" } }, "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww=="], "clone-response/mimic-response": ["mimic-response@1.0.1", "", {}, "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ=="], + "cosmiconfig/js-yaml": ["js-yaml@4.3.2", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA=="], + "cross-spawn/which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], "defaults/clone": ["clone@1.0.4", "", {}, "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg=="], + "diverged/pngjs": ["pngjs@3.4.0", "", {}, "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w=="], + "enquirer/ansi-colors": ["ansi-colors@4.1.3", "", {}, "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw=="], "express/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], @@ -1421,25 +1514,41 @@ "gulp-cli/gulplog": ["gulplog@2.2.0", "", { "dependencies": { "glogg": "^2.2.0" } }, "sha512-V2FaKiOhpR3DRXZuYdRLn/qiY0yI5XmqbTKrYbdemJ+xOh2d2MOweI/XFgMzd/9+1twdvMwllnZbWZNJ+BOm4A=="], - "gulp-cli/yargs": ["yargs@16.2.0", "", { "dependencies": { "cliui": "^7.0.2", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.0", "y18n": "^5.0.5", "yargs-parser": "^20.2.2" } }, "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw=="], + "gulp-cli/yargs": ["yargs@16.2.2", "", { "dependencies": { "cliui": "^7.0.2", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.0", "y18n": "^5.0.5", "yargs-parser": "^20.2.2" } }, "sha512-Nt9ZJjXTv5R8MHbqby/wXQ6Gi0Bb3TcYZkR1bzuL4yB2OxWPkXknz513gEF0GoA6tn00UpbPvERW8rzCuWCA6w=="], "gulp-uglify/through2": ["through2@2.0.5", "", { "dependencies": { "readable-stream": "~2.3.6", "xtend": "~4.0.1" } }, "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ=="], + "http-errors/inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], + "is-extendable/is-plain-object": ["is-plain-object@2.0.4", "", { "dependencies": { "isobject": "^3.0.1" } }, "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og=="], + "jsonwebtoken/semver": ["semver@7.8.5", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA=="], + "lazystream/readable-stream": ["readable-stream@2.3.8", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="], "log-symbols/chalk": ["chalk@2.4.2", "", { "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="], "micromatch/picomatch": ["picomatch@2.3.2", "", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="], + "open/is-wsl": ["is-wsl@2.2.0", "", { "dependencies": { "is-docker": "^2.0.0" } }, "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww=="], + "ora/chalk": ["chalk@3.0.0", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg=="], + "pixelmatch/pngjs": ["pngjs@3.4.0", "", {}, "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w=="], + + "playwright/playwright-core": ["playwright-core@1.63.0", "", { "bin": { "playwright-core": "cli.js" } }, "sha512-rYCsBF/M5HjUch52bbtVONEFjv6Xu8sm8h72dNlR5bzIE1fvC/bxgspzkjSfU+MweEMmPM8KJebG6nnyxo5mCg=="], + "proxy-agent/lru-cache": ["lru-cache@7.18.3", "", {}, "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA=="], + "puppeteer/devtools-protocol": ["devtools-protocol@0.0.1312386", "", {}, "sha512-DPnhUXvmvKT2dFA/j7B+riVLUt9Q6RKJlcppojL5CoRywJJKLDYnRlw0gTFKfgDPHP5E04UoB71SxoJlVZy8FA=="], + + "puppeteer/puppeteer-core": ["puppeteer-core@22.15.0", "", { "dependencies": { "@puppeteer/browsers": "2.3.0", "chromium-bidi": "0.6.3", "debug": "^4.3.6", "devtools-protocol": "0.0.1312386", "ws": "^8.18.0" } }, "sha512-cHArnywCiAAVXa3t4GGL2vttNxh7GqXtIYGym99egkNJ3oG//wL9LkvO4WE8W1TJe95t1F1ocu9X4xWaGsOKOA=="], + + "puppeteer-core/@puppeteer/browsers": ["@puppeteer/browsers@2.13.2", "", { "dependencies": { "debug": "^4.4.3", "extract-zip": "^2.0.1", "progress": "^2.0.3", "proxy-agent": "^6.5.0", "semver": "^7.7.4", "tar-fs": "^3.1.1", "yargs": "^17.7.2" }, "bin": { "browsers": "lib/cjs/main-cli.js" } }, "sha512-5EUZSUIc37H6aIXyWO0Z4y8NlF8NnjgmqeQgOGiswAU7pY0HOo16ho4+alIWmSfdZnjqBRawMsP3I5YqLSn6kw=="], + "puppeteer-core/devtools-protocol": ["devtools-protocol@0.0.1608973", "", {}, "sha512-Tpm17fxYzt+J7VrGdc1k8YdRqS3YV7se/M6KeemEqvUbq/n7At1rWVuXMxQgpWkdwSdIEKYbU//Bve+Shm4YNQ=="], - "puppeteer-core/ws": ["ws@8.20.1", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-It4dO0K5v//JtTXuPkfEOaI3uUN87iYPnqo/ZzqCoG3g8uhA66QUMs/SrM0YK7/NAu+r4LMh/9dq2A7k+rHs+w=="], + "puppeteer-core/ws": ["ws@8.21.3", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw=="], "raw-body/iconv-lite": ["iconv-lite@0.4.24", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3" } }, "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA=="], @@ -1451,21 +1560,25 @@ "send/mime": ["mime@1.6.0", "", { "bin": { "mime": "cli.js" } }, "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="], - "speedline-core/@types/node": ["@types/node@25.8.0", "", { "dependencies": { "undici-types": ">=7.24.0 <7.24.7" } }, "sha512-TCFSk8IZh+iLX1xtksoBVtdmgL+1IX0fC9BeU4QqFSuNdN/K+HUlhqOzEmSYYpZUVsLYcPqc9KX+60iDuninSQ=="], + "sha.js/inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], - "sver/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + "temp/rimraf": ["rimraf@2.6.3", "", { "dependencies": { "glob": "^7.1.3" }, "bin": { "rimraf": "./bin.js" } }, "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA=="], "through2/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], "to-buffer/isarray": ["isarray@2.0.5", "", {}, "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="], + "unbzip2-stream/buffer": ["buffer@5.7.1", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" } }, "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ=="], + "vinyl-sourcemaps-apply/source-map": ["source-map@0.5.7", "", {}, "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ=="], + "xml2js/xmlbuilder": ["xmlbuilder@11.0.1", "", {}, "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA=="], + "yauzl/buffer-crc32": ["buffer-crc32@0.2.13", "", {}, "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ=="], "@isaacs/cliui/string-width/emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], - "@isaacs/cliui/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], + "@isaacs/cliui/strip-ansi/ansi-regex": ["ansi-regex@6.3.0", "", {}, "sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ=="], "@isaacs/cliui/wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], @@ -1491,25 +1604,7 @@ "@octokit/request/@octokit/types/@octokit/openapi-types": ["@octokit/openapi-types@24.2.0", "", {}, "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg=="], - "@sentry/node/minimatch/brace-expansion": ["brace-expansion@2.1.0", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w=="], - - "@types/cacheable-request/@types/node/undici-types": ["undici-types@7.24.6", "", {}, "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg=="], - - "@types/connect/@types/node/undici-types": ["undici-types@7.24.6", "", {}, "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg=="], - - "@types/jsonwebtoken/@types/node/undici-types": ["undici-types@7.24.6", "", {}, "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg=="], - - "@types/keyv/@types/node/undici-types": ["undici-types@7.24.6", "", {}, "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg=="], - - "@types/mysql/@types/node/undici-types": ["undici-types@7.24.6", "", {}, "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg=="], - - "@types/pg/@types/node/undici-types": ["undici-types@7.24.6", "", {}, "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg=="], - - "@types/responselike/@types/node/undici-types": ["undici-types@7.24.6", "", {}, "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg=="], - - "@types/tedious/@types/node/undici-types": ["undici-types@7.24.6", "", {}, "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg=="], - - "@types/yauzl/@types/node/undici-types": ["undici-types@7.24.6", "", {}, "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg=="], + "@sentry/node/minimatch/brace-expansion": ["brace-expansion@2.1.4", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg=="], "bestzip/yargs/cliui": ["cliui@7.0.4", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", "wrap-ansi": "^7.0.0" } }, "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ=="], @@ -1517,7 +1612,7 @@ "body-parser/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], - "chrome-launcher/@types/node/undici-types": ["undici-types@7.24.6", "", {}, "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg=="], + "cosmiconfig/js-yaml/argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], "cross-spawn/which/isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], @@ -1525,8 +1620,6 @@ "finalhandler/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], - "glob-watcher/chokidar/fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], - "glob-watcher/chokidar/readdirp": ["readdirp@3.6.0", "", { "dependencies": { "picomatch": "^2.2.1" } }, "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="], "global-prefix/which/isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], @@ -1539,6 +1632,8 @@ "gulp-uglify/through2/readable-stream": ["readable-stream@2.3.8", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="], + "lazystream/readable-stream/inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], + "lazystream/readable-stream/safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="], "lazystream/readable-stream/string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], @@ -1549,13 +1644,21 @@ "log-symbols/chalk/supports-color": ["supports-color@5.5.0", "", { "dependencies": { "has-flag": "^3.0.0" } }, "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow=="], + "puppeteer-core/@puppeteer/browsers/semver": ["semver@7.8.5", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA=="], + + "puppeteer/puppeteer-core/chromium-bidi": ["chromium-bidi@0.6.3", "", { "dependencies": { "mitt": "3.0.1", "urlpattern-polyfill": "10.0.0", "zod": "3.23.8" }, "peerDependencies": { "devtools-protocol": "*" } }, "sha512-qXlsCmpCZJAnoTYI83Iu6EdYQpMYdVkCfq08KDh2pmlVqK5t5IA9mGs4/LwCwp4fqisSOMXZxP3HIh8w8aRn0A=="], + + "puppeteer/puppeteer-core/ws": ["ws@8.21.3", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw=="], + "rimraf/glob/minimatch": ["minimatch@9.0.9", "", { "dependencies": { "brace-expansion": "^2.0.2" } }, "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg=="], "rimraf/glob/path-scurry": ["path-scurry@1.11.1", "", { "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA=="], "send/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], - "speedline-core/@types/node/undici-types": ["undici-types@7.24.6", "", {}, "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg=="], + "temp/rimraf/glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], + + "through2/readable-stream/inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], "@sentry/node/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], @@ -1563,6 +1666,8 @@ "gulp-cli/gulplog/glogg/sparkles": ["sparkles@2.1.0", "", {}, "sha512-r7iW1bDw8R/cFifrD3JnQJX0K1jqT0kprL48BiBpLZLJPmAm34zsVBsK5lc7HirZYZqMW65dOXZgbAGt/I6frg=="], + "gulp-uglify/through2/readable-stream/inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], + "gulp-uglify/through2/readable-stream/safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="], "gulp-uglify/through2/readable-stream/string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], @@ -1571,12 +1676,22 @@ "log-symbols/chalk/supports-color/has-flag": ["has-flag@3.0.0", "", {}, "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="], - "rimraf/glob/minimatch/brace-expansion": ["brace-expansion@2.1.0", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w=="], + "puppeteer/puppeteer-core/chromium-bidi/zod": ["zod@3.23.8", "", {}, "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g=="], + + "rimraf/glob/minimatch/brace-expansion": ["brace-expansion@2.1.4", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg=="], "rimraf/glob/path-scurry/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], + "temp/rimraf/glob/inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], + + "temp/rimraf/glob/minimatch": ["minimatch@3.1.5", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w=="], + "log-symbols/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.3", "", {}, "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="], "rimraf/glob/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + + "temp/rimraf/glob/minimatch/brace-expansion": ["brace-expansion@1.1.18", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw=="], + + "temp/rimraf/glob/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], } } diff --git a/composer.json b/composer.json index 43cbdfd..8d3746b 100644 --- a/composer.json +++ b/composer.json @@ -11,7 +11,7 @@ "nutrition" ], "homepage": "https://wordpress.org/plugins/cooked/", - "version": "1.16.0", + "version": "1.16.1", "type": "wordpress-plugin", "license": "GPL-2.0-or-later", "authors": [ diff --git a/composer.lock b/composer.lock index e1da5c6..e11fc1e 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": "867ea208066f04f2fd8c088bac57cff8", + "content-hash": "46923b3513153f90896e6b66e390670e", "packages": [ { "name": "nxp/math-executor", @@ -521,16 +521,16 @@ }, { "name": "php-stubs/wordpress-stubs", - "version": "v6.9.4", + "version": "v7.1.0", "source": { "type": "git", "url": "https://github.com/php-stubs/wordpress-stubs.git", - "reference": "90a9412826b9944f93b10bf41d795b5fe68abcd5" + "reference": "394570301894799e69a4aa117c9c995427e3ba04" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-stubs/wordpress-stubs/zipball/90a9412826b9944f93b10bf41d795b5fe68abcd5", - "reference": "90a9412826b9944f93b10bf41d795b5fe68abcd5", + "url": "https://api.github.com/repos/php-stubs/wordpress-stubs/zipball/394570301894799e69a4aa117c9c995427e3ba04", + "reference": "394570301894799e69a4aa117c9c995427e3ba04", "shasum": "" }, "conflict": { @@ -540,13 +540,13 @@ "dealerdirect/phpcodesniffer-composer-installer": "^1.0", "nikic/php-parser": "^5.5", "php": "^7.4 || ^8.0", - "php-stubs/generator": "^0.8.6", + "php-stubs/generator": "^0.9", "phpdocumentor/reflection-docblock": "^6.0", - "phpstan/phpstan": "^2.1", + "phpstan/phpstan": "^2.2", "phpunit/phpunit": "^9.5", "symfony/polyfill-php80": "*", - "szepeviktor/phpcs-psr-12-neutron-hybrid-ruleset": "^1.1.1", - "wp-coding-standards/wpcs": "3.1.0 as 2.3.0" + "szepeviktor/phpcs-psr-12-neutron-hybrid-ruleset": "^1.2", + "wp-coding-standards/wpcs": "3.4.1 as 2.3.0" }, "suggest": { "paragonie/sodium_compat": "Pure PHP implementation of libsodium", @@ -567,9 +567,9 @@ ], "support": { "issues": "https://github.com/php-stubs/wordpress-stubs/issues", - "source": "https://github.com/php-stubs/wordpress-stubs/tree/v6.9.4" + "source": "https://github.com/php-stubs/wordpress-stubs/tree/v7.1.0" }, - "time": "2026-05-01T20:36:01+00:00" + "time": "2026-08-28T00:32:06+00:00" }, { "name": "phpcompatibility/php-compatibility", @@ -1024,11 +1024,11 @@ }, { "name": "phpstan/phpstan", - "version": "2.2.8", + "version": "2.2.13", "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/e285254e60f33c21902efef4a926ca0987c06804", - "reference": "e285254e60f33c21902efef4a926ca0987c06804", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/9ba9ac76ee9c5cf5b56d58eb5deec6315b7a0260", + "reference": "9ba9ac76ee9c5cf5b56d58eb5deec6315b7a0260", "shasum": "" }, "require": { @@ -1084,7 +1084,7 @@ "type": "github" } ], - "time": "2026-08-04T22:21:45+00:00" + "time": "2026-09-03T20:38:19+00:00" }, { "name": "phpunit/php-code-coverage", @@ -2592,21 +2592,21 @@ }, { "name": "szepeviktor/phpstan-wordpress", - "version": "v2.0.3", + "version": "v2.0.4", "source": { "type": "git", "url": "https://github.com/szepeviktor/phpstan-wordpress.git", - "reference": "aa722f037b2d034828cd6c55ebe9e5c74961927e" + "reference": "84577e2ea1e4c2a95537fe5ea2ac8e18f4ceab1a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/szepeviktor/phpstan-wordpress/zipball/aa722f037b2d034828cd6c55ebe9e5c74961927e", - "reference": "aa722f037b2d034828cd6c55ebe9e5c74961927e", + "url": "https://api.github.com/repos/szepeviktor/phpstan-wordpress/zipball/84577e2ea1e4c2a95537fe5ea2ac8e18f4ceab1a", + "reference": "84577e2ea1e4c2a95537fe5ea2ac8e18f4ceab1a", "shasum": "" }, "require": { "php": "^7.4 || ^8.0", - "php-stubs/wordpress-stubs": "^6.6.2", + "php-stubs/wordpress-stubs": ">=6.6.2", "phpstan/phpstan": "^2.0" }, "require-dev": { @@ -2649,9 +2649,9 @@ ], "support": { "issues": "https://github.com/szepeviktor/phpstan-wordpress/issues", - "source": "https://github.com/szepeviktor/phpstan-wordpress/tree/v2.0.3" + "source": "https://github.com/szepeviktor/phpstan-wordpress/tree/v2.0.4" }, - "time": "2025-09-14T02:58:22+00:00" + "time": "2026-05-22T16:22:09+00:00" }, { "name": "theseer/tokenizer", diff --git a/cooked.php b/cooked.php index ea0c1d0..6efd735 100644 --- a/cooked.php +++ b/cooked.php @@ -5,13 +5,13 @@ * Description: A recipe plugin for WordPress. * Author: Gora Tech * Author URI: https://goratech.dev - * Version: 1.16.0 + * Version: 1.16.1 * Text Domain: cooked * Domain Path: /languages * License: GPLv2 or later * License URI: https://www.gnu.org/licenses/gpl-2.0.html * Requires at least: 6.8 - * Tested up to: 7.0 + * Tested up to: 7.1 * Requires PHP: 7.4 * Contributors: xjsv, boxystudio * Tags: recipe, recipes, food, cooking, nutrition @@ -40,7 +40,7 @@ require_once __DIR__ . '/vendor/autoload.php'; define( 'COOKED_DEV', false ); -define( 'COOKED_VERSION', '1.16.0' ); +define( 'COOKED_VERSION', '1.16.1' ); if ( ! class_exists( 'Cooked_Plugin' ) ) : @@ -535,6 +535,7 @@ public function load_textdomain() { load_textdomain( 'cooked', $lang_file_ext ); } else { // Load the default language files. + // phpcs:ignore PluginCheck.CodeAnalysis.DiscouragedFunctions.load_plugin_textdomainFound -- Bundled /languages .mo files. load_plugin_textdomain( 'cooked', false, COOKED_FOLDER . '/languages' ); } } diff --git a/includes/class.cooked-admin-enqueues.php b/includes/class.cooked-admin-enqueues.php index 3bd71cc..0e48c5b 100644 --- a/includes/class.cooked-admin-enqueues.php +++ b/includes/class.cooked-admin-enqueues.php @@ -170,6 +170,9 @@ public function admin_enqueues( $hook ) { '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' ), + 'cooked_import_nonce' => wp_create_nonce( 'cooked_admin_import' ), + 'cooked_migrate_nonce' => wp_create_nonce( 'cooked_migrate_recipes' ), + 'cooked_import_recipes_nonce' => wp_create_nonce( 'cooked_import_recipes' ), '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' ), diff --git a/includes/class.cooked-admin-menus.php b/includes/class.cooked-admin-menus.php index f0f7572..a1d2745 100644 --- a/includes/class.cooked-admin-menus.php +++ b/includes/class.cooked-admin-menus.php @@ -87,7 +87,7 @@ public function parent_file_filter($parent_file) { // Settings Panel public function cooked_settings_page() { if (!current_user_can('edit_cooked_settings')) { - wp_die(__('You do not have sufficient permissions to access this page.', 'cooked')); + wp_die(esc_html__('You do not have sufficient permissions to access this page.', 'cooked')); } include COOKED_DIR . 'templates/admin/settings.php'; @@ -96,7 +96,7 @@ public function cooked_settings_page() { // Import Page public function cooked_import_page() { if (!current_user_can('edit_cooked_settings')) { - wp_die(__('You do not have sufficient permissions to access this page.', 'cooked')); + wp_die(esc_html__('You do not have sufficient permissions to access this page.', 'cooked')); } include COOKED_DIR . 'templates/admin/import.php'; @@ -105,7 +105,7 @@ public function cooked_import_page() { // Welcome Page public function cooked_welcome_content() { if (!current_user_can('edit_cooked_settings')) { - wp_die(__('You do not have sufficient permissions to access this page.', 'cooked')); + wp_die(esc_html__('You do not have sufficient permissions to access this page.', 'cooked')); } include COOKED_DIR . 'templates/admin/welcome.php'; @@ -114,7 +114,7 @@ public function cooked_welcome_content() { // Cooked Pro public function cooked_pro() { if (!current_user_can('edit_cooked_settings')) { - wp_die(__('You do not have sufficient permissions to access this page.', 'cooked')); + wp_die(esc_html__('You do not have sufficient permissions to access this page.', 'cooked')); } include COOKED_DIR . 'templates/admin/pro.php'; diff --git a/includes/class.cooked-ajax.php b/includes/class.cooked-ajax.php index 2f01fe9..f9c8b8d 100644 --- a/includes/class.cooked-ajax.php +++ b/includes/class.cooked-ajax.php @@ -62,10 +62,43 @@ function __construct() { add_action( 'wp_ajax_nopriv_cooked_parse_bulk_ingredients', [&$this, 'parse_bulk_ingredients'] ); } - public function get_migrate_ids() { - if (!current_user_can('edit_cooked_recipes')): + private static function recipe_ids_from_json( $json ) { + $decoded = json_decode( $json, true ); + if ( ! is_array( $decoded ) || empty( $decoded ) ) { + return []; + } + + $ids = []; + foreach ( $decoded as $rid ) { + $safe_id = absint( $rid ); + if ( $safe_id ) { + $ids[] = $safe_id; + } + } + + return $ids; + } + + private static function sanitize_import_type( $import_type ) { + if ( ! in_array( $import_type, [ 'delicious_recipes', 'wp_recipe_maker' ], true ) ) { + return ''; + } + return $import_type; + } + + private static function require_settings_ajax( $nonce_action ) { + check_ajax_referer( $nonce_action, 'nonce' ); + if ( ! current_user_can( 'edit_cooked_settings' ) ) { wp_die(); - endif; + } + } + + private static function user_can_edit_post_of_type( $post_id, $post_type ) { + return $post_type && get_post_type( $post_id ) === $post_type && current_user_can( 'edit_post', $post_id ); + } + + public function get_migrate_ids() { + self::require_settings_ajax( 'cooked_migrate_recipes' ); $old_recipes = get_transient('cooked_classic_recipes'); if ($old_recipes != 'complete'): @@ -84,15 +117,13 @@ public function get_migrate_ids() { } public function get_import_ids() { - if (!current_user_can('edit_cooked_recipes')): - wp_die(); - endif; - - $import_type = $_POST['import_type']; + self::require_settings_ajax( 'cooked_import_recipes' ); + $import_type = isset( $_POST['import_type'] ) ? sanitize_key( wp_unslash( $_POST['import_type'] ) ) : ''; + $import_type = self::sanitize_import_type( $import_type ); $recipes = []; - if ($import_type === 'delicious_recipes') { + if ( $import_type === 'delicious_recipes' ) { $args = [ 'post_type' => 'recipe', 'posts_per_page' => -1, @@ -105,7 +136,7 @@ public function get_import_ids() { ], ], ]; - } elseif ($import_type === 'wp_recipe_maker') { + } elseif ( $import_type === 'wp_recipe_maker' ) { $args = [ 'post_type' => 'wprm_recipe', 'posts_per_page' => -1, @@ -119,6 +150,9 @@ public function get_import_ids() { ], ], ]; + } else { + echo 'false'; + wp_die(); } $_recipes = new WP_Query( $args ); @@ -147,133 +181,102 @@ public function get_import_ids() { public function migrate_recipes() { $bulk_amount = 10; - if (!current_user_can('edit_cooked_recipes')) { + self::require_settings_ajax( 'cooked_migrate_recipes' ); + + $recipe_ids = self::recipe_ids_from_json( isset( $_POST['recipe_ids'] ) ? wp_unslash( $_POST['recipe_ids'] ) : '' ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- JSON decoded then absint in recipe_ids_from_json. + if ( empty( $recipe_ids ) ) { wp_die(); } - if ( isset($_POST['recipe_ids']) ) { - // Sanitize Recipe IDs - $recipe_ids = json_decode( $_POST['recipe_ids'], true ); + $leftover_recipe_ids = array_slice( $recipe_ids, $bulk_amount ); + $recipe_ids = array_slice( $recipe_ids, 0, $bulk_amount ); - 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; - } + if ( ! empty( $recipe_ids ) ) { + foreach ( $recipe_ids as $rid ) { + if ( ! self::user_can_edit_post_of_type( $rid, 'cp_recipe' ) ) { + continue; } - $recipe_ids = $_recipe_ids; - } else { - return false; - } - - $leftover_recipe_ids = array_slice( $recipe_ids, $bulk_amount ); - $recipe_ids = array_slice( $recipe_ids, 0, $bulk_amount ); - - if ( !empty($recipe_ids) ) { - foreach( $recipe_ids as $rid ) { - - $recipe_settings = Cooked_Recipes::get_settings( $rid ); - - if ( !empty( $recipe_settings ) && !isset( $recipe_settings['cooked_version'] ) || !empty( $recipe_settings ) && isset( $recipe_settings['cooked_version'] ) && !$recipe_settings['cooked_version'] ) { - $recipe_settings['cooked_version'] = COOKED_VERSION; + $recipe_settings = Cooked_Recipes::get_settings( $rid ); - // Migrate the recipe settings. - update_post_meta( $rid, '_recipe_settings', $recipe_settings ); - $recipe_excerpt = isset($recipe_settings['excerpt']) && $recipe_settings['excerpt'] ? $recipe_settings['excerpt'] : get_the_title( $rid ); + if ( ! empty( $recipe_settings ) && ! isset( $recipe_settings['cooked_version'] ) || ! empty( $recipe_settings ) && isset( $recipe_settings['cooked_version'] ) && ! $recipe_settings['cooked_version'] ) { + $recipe_settings['cooked_version'] = COOKED_VERSION; + update_post_meta( $rid, '_recipe_settings', $recipe_settings ); + $recipe_excerpt = isset( $recipe_settings['excerpt'] ) && $recipe_settings['excerpt'] ? $recipe_settings['excerpt'] : get_the_title( $rid ); - $seo_content = apply_filters( 'cooked_seo_recipe_content', '[cooked-excerpt]

' . __('Ingredients','cooked') . '

[cooked-ingredients checkboxes=false]

' . __('Directions','cooked') . '

[cooked-directions numbers=false]' ); - $seo_content = do_shortcode( $seo_content ); + $seo_content = apply_filters( 'cooked_seo_recipe_content', '[cooked-excerpt]

' . __( 'Ingredients', 'cooked' ) . '

[cooked-ingredients checkboxes=false]

' . __( 'Directions', 'cooked' ) . '

[cooked-directions numbers=false]' ); + $seo_content = do_shortcode( $seo_content ); - wp_update_post([ - 'ID' => $rid, - 'post_excerpt' => $recipe_excerpt, - 'post_content' => $seo_content - ]); - - } - } - - if ( !empty( $leftover_recipe_ids ) ) { - echo wp_json_encode( $leftover_recipe_ids ); - wp_die(); + wp_update_post( [ + 'ID' => $rid, + 'post_excerpt' => $recipe_excerpt, + 'post_content' => $seo_content, + ] ); } - } - set_transient( 'cooked_classic_recipes', 'complete', 60 * 60 * 24 * 7 ); - echo 'false'; - wp_die(); - + if ( ! empty( $leftover_recipe_ids ) ) { + echo wp_json_encode( $leftover_recipe_ids ); + wp_die(); + } } + set_transient( 'cooked_classic_recipes', 'complete', 60 * 60 * 24 * 7 ); + echo 'false'; wp_die(); } public function import_recipes() { - if (!current_user_can('edit_cooked_recipes')) { - wp_die(); - } + self::require_settings_ajax( 'cooked_import_recipes' ); require_once COOKED_DIR . 'includes/class.cooked-delicious-recipes.php'; require_once COOKED_DIR . 'includes/class.cooked-recipe-maker.php'; $bulk_amount = 10; + $recipe_ids = self::recipe_ids_from_json( isset( $_POST['recipe_ids'] ) ? wp_unslash( $_POST['recipe_ids'] ) : '' ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- JSON decoded then absint in recipe_ids_from_json. + $import_type = isset( $_POST['import_type'] ) ? sanitize_key( wp_unslash( $_POST['import_type'] ) ) : ''; + $import_type = self::sanitize_import_type( $import_type ); - if ( isset($_POST['recipe_ids']) ) { - // Sanitize 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; - } - - $leftover_recipe_ids = array_slice( $recipe_ids, $bulk_amount ); - $recipe_ids = array_slice( $recipe_ids, 0, $bulk_amount ); + if ( empty( $recipe_ids ) || ! $import_type ) { + wp_die(); + } - $import_type = $_POST['import_type']; + $expected_type = $import_type === 'delicious_recipes' ? 'recipe' : 'wprm_recipe'; + $leftover_recipe_ids = array_slice( $recipe_ids, $bulk_amount ); + $recipe_ids = array_slice( $recipe_ids, 0, $bulk_amount ); - if ( !empty($recipe_ids) ) { - foreach ( $recipe_ids as $rid ) { - if ($import_type === 'delicious_recipes') { - Cooked_Delicious_Recipes::import_recipe( $rid ); - } elseif ($import_type === 'wp_recipe_maker') { - Cooked_Recipe_Maker_Recipes::import_recipe( $rid ); - } + if ( ! empty( $recipe_ids ) ) { + foreach ( $recipe_ids as $rid ) { + if ( ! self::user_can_edit_post_of_type( $rid, $expected_type ) ) { + continue; } - if ( !empty( $leftover_recipe_ids ) ) { - echo wp_json_encode( $leftover_recipe_ids ); - wp_die(); - } else { - if ($import_type === 'delicious_recipes') { - update_option( 'cooked_delicious_recipes_imported', true ); - } elseif ($import_type === 'wp_recipe_maker') { - update_option( 'cooked_wp_recipe_maker_imported', true ); - } + if ( $import_type === 'delicious_recipes' ) { + Cooked_Delicious_Recipes::import_recipe( $rid ); + } elseif ( $import_type === 'wp_recipe_maker' ) { + Cooked_Recipe_Maker_Recipes::import_recipe( $rid ); } } - echo 'false'; - wp_die(); + if ( ! empty( $leftover_recipe_ids ) ) { + echo wp_json_encode( $leftover_recipe_ids ); + wp_die(); + } + + if ( $import_type === 'delicious_recipes' ) { + update_option( 'cooked_delicious_recipes_imported', true ); + } elseif ( $import_type === 'wp_recipe_maker' ) { + update_option( 'cooked_wp_recipe_maker_imported', true ); + } } + echo 'false'; wp_die(); } public function get_recipe_ids() { - if (!wp_verify_nonce($_POST['nonce'], 'cooked_save_default_bulk') || !current_user_can('edit_cooked_default_template')) { + $nonce = isset( $_POST['nonce'] ) ? wp_unslash( $_POST['nonce'] ) : ''; // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Verify nonce after unslash; do not sanitize_text_field a nonce. + if ( ! wp_verify_nonce( $nonce, 'cooked_save_default_bulk' ) || ! current_user_can( 'edit_cooked_default_template' ) ) { wp_die(); } @@ -290,7 +293,8 @@ public function get_recipe_ids() { } public function get_recipe_count() { - if (!wp_verify_nonce($_POST['nonce'], 'cooked_save_default_bulk') || !current_user_can('edit_cooked_default_template')) { + $nonce = isset( $_POST['nonce'] ) ? wp_unslash( $_POST['nonce'] ) : ''; // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Verify nonce after unslash; do not sanitize_text_field a nonce. + if ( ! wp_verify_nonce( $nonce, 'cooked_save_default_bulk' ) || ! current_user_can( 'edit_cooked_default_template' ) ) { wp_die(); } @@ -308,16 +312,17 @@ public function get_recipe_count() { public function save_default_bulk() { $per_page = 20; - if (!wp_verify_nonce($_POST['nonce'], 'cooked_save_default_bulk') || !current_user_can('edit_cooked_default_template')) { + $nonce = isset( $_POST['nonce'] ) ? wp_unslash( $_POST['nonce'] ) : ''; // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Verify nonce after unslash; do not sanitize_text_field a nonce. + if ( ! wp_verify_nonce( $nonce, 'cooked_save_default_bulk' ) || ! current_user_can( 'edit_cooked_default_template' ) ) { wp_die(); } - if (!isset($_POST['default_content'])) { + if ( ! isset( $_POST['default_content'] ) ) { wp_send_json_error( [ 'message' => __( 'No default content provided.', 'cooked' ) ] ); } - $page = isset($_POST['page']) ? absint($_POST['page']) : 0; - $content = wp_kses_post($_POST['default_content']); + $page = isset( $_POST['page'] ) ? absint( wp_unslash( $_POST['page'] ) ) : 0; + $content = wp_kses_post( wp_unslash( $_POST['default_content'] ) ); $args = [ 'post_type' => 'cp_recipe', @@ -354,15 +359,16 @@ public function save_default_bulk() { public function save_default() { global $_cooked_settings; - if (!wp_verify_nonce($_POST['nonce'], 'cooked_save_default') || !current_user_can('edit_cooked_default_template')) { + $nonce = isset( $_POST['nonce'] ) ? wp_unslash( $_POST['nonce'] ) : ''; // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Verify nonce after unslash; do not sanitize_text_field a nonce. + if ( ! wp_verify_nonce( $nonce, 'cooked_save_default' ) || ! current_user_can( 'edit_cooked_default_template' ) ) { wp_die(); } - if (isset($_POST['default_content'])) { - $_cooked_settings['default_content'] = wp_kses_post( $_POST['default_content'] ); + if ( isset( $_POST['default_content'] ) ) { + $_cooked_settings['default_content'] = wp_kses_post( wp_unslash( $_POST['default_content'] ) ); update_option('cooked_settings', $_cooked_settings); } else { - echo __( 'No default content provided.', 'cooked' ); + echo esc_html__( 'No default content provided.', 'cooked' ); } wp_die(); @@ -390,16 +396,23 @@ public function load_default() { * Handle CSV file upload */ public function upload_csv() { - if (!current_user_can('edit_cooked_recipes')) { + $nonce = isset( $_POST['nonce'] ) ? wp_unslash( $_POST['nonce'] ) : ''; // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Verify nonce after unslash; do not sanitize_text_field a nonce. + if ( ! wp_verify_nonce( $nonce, 'cooked_admin_import' ) || ! current_user_can( 'edit_cooked_settings' ) ) { wp_send_json_error(['message' => __('You do not have permission to import recipes.', 'cooked')]); } - if (!isset($_FILES['csv_file']) || $_FILES['csv_file']['error'] !== UPLOAD_ERR_OK) { + if ( ! isset( $_FILES['csv_file'] ) || ! isset( $_FILES['csv_file']['error'] ) || UPLOAD_ERR_OK !== (int) $_FILES['csv_file']['error'] ) { wp_send_json_error(['message' => __('File upload failed.', 'cooked')]); } + $csv_name = isset( $_FILES['csv_file']['name'] ) ? sanitize_file_name( wp_unslash( $_FILES['csv_file']['name'] ) ) : ''; + if ( ! $csv_name ) { + wp_send_json_error(['message' => __('File upload failed.', 'cooked')]); + } + $_FILES['csv_file']['name'] = $csv_name; + // Validate file type - $file_type = wp_check_filetype($_FILES['csv_file']['name']); + $file_type = wp_check_filetype( $csv_name ); if ($file_type['ext'] !== 'csv') { wp_send_json_error(['message' => __('Invalid file type. Please upload a CSV file.', 'cooked')]); } @@ -426,11 +439,12 @@ public function upload_csv() { * Process CSV file and import recipes */ public function process_csv() { - if (!current_user_can('edit_cooked_recipes')) { + $nonce = isset( $_POST['nonce'] ) ? wp_unslash( $_POST['nonce'] ) : ''; // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Verify nonce after unslash; do not sanitize_text_field a nonce. + if ( ! wp_verify_nonce( $nonce, 'cooked_admin_import' ) || ! current_user_can( 'edit_cooked_settings' ) ) { wp_send_json_error(['message' => __('You do not have permission to import recipes.', 'cooked')]); } - $transient_key = isset($_POST['transient_key']) ? sanitize_text_field($_POST['transient_key']) : ''; + $transient_key = isset( $_POST['transient_key'] ) ? sanitize_text_field( wp_unslash( $_POST['transient_key'] ) ) : ''; $file_path = get_transient($transient_key); if (!$file_path || !file_exists($file_path)) { @@ -443,13 +457,14 @@ public function process_csv() { // Clean up if (file_exists($file_path)) { - @unlink($file_path); + wp_delete_file($file_path); } delete_transient($transient_key); if ($results['success'] > 0) { wp_send_json_success([ 'message' => sprintf( + /* translators: %d: number of recipes imported */ __('Successfully imported %d recipe(s).', 'cooked'), $results['success'] ), @@ -466,11 +481,12 @@ public function process_csv() { } public function parse_bulk_ingredients() { - if ( ! check_ajax_referer( 'cooked_bulk_add', 'nonce', false ) ) { + $nonce = isset( $_POST['nonce'] ) ? wp_unslash( $_POST['nonce'] ) : ''; // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Verify nonce after unslash; do not sanitize_text_field a nonce. + if ( ! wp_verify_nonce( $nonce, 'cooked_bulk_add' ) ) { wp_send_json_error( [ 'message' => __( 'Security check failed.', 'cooked' ) ] ); } - $lines = isset( $_POST['lines'] ) ? (array) $_POST['lines'] : []; + $lines = isset( $_POST['lines'] ) ? wp_unslash( (array) $_POST['lines'] ) : []; // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Each line is sanitize_text_field'd below. if ( empty( $lines ) ) { wp_send_json_error( [ 'message' => __( 'No ingredients provided.', 'cooked' ) ] ); @@ -505,7 +521,6 @@ public function parse_bulk_ingredients() { // 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 ) ); diff --git a/includes/class.cooked-allergens.php b/includes/class.cooked-allergens.php index e02cc01..f59bc44 100644 --- a/includes/class.cooked-allergens.php +++ b/includes/class.cooked-allergens.php @@ -271,7 +271,7 @@ public static function render_from_recipe( $recipe ) { } $recipe_settings = Cooked_Recipes::get_settings( $recipe['id'] ); - echo self::render( $recipe_settings ); + echo wp_kses_post( self::render( $recipe_settings ) ); } /** @@ -361,8 +361,8 @@ public static function cooked_info_allergens( $recipe_settings ) { } echo ''; - echo '' . __( 'Allergens', 'cooked' ) . ''; - echo $html; + echo '' . esc_html__( 'Allergens', 'cooked' ) . ''; + echo wp_kses_post( $html ); echo ''; } diff --git a/includes/class.cooked-csv-import.php b/includes/class.cooked-csv-import.php index 31adb38..ee3c25d 100644 --- a/includes/class.cooked-csv-import.php +++ b/includes/class.cooked-csv-import.php @@ -46,7 +46,7 @@ public static function import_from_file( $file_path ) { /** * Open and parse CSV file */ - $handle = fopen( $file_path, 'r' ); + $handle = fopen( $file_path, 'r' ); // phpcs:ignore WordPress.WP.AlternativeFunctions.file_system_operations_fopen -- CSV row streaming. if ( false === $handle ) { $results['errors'][] = __( 'Could not open CSV file.', 'cooked' ); return $results; @@ -58,7 +58,7 @@ public static function import_from_file( $file_path ) { $headers = fgetcsv( $handle ); if ( false === $headers || empty( $headers ) ) { $results['errors'][] = __( 'CSV file is empty or invalid.', 'cooked' ); - fclose( $handle ); + fclose( $handle ); // phpcs:ignore WordPress.WP.AlternativeFunctions.file_system_operations_fclose -- CSV row streaming. return $results; } @@ -73,7 +73,7 @@ public static function import_from_file( $file_path ) { */ if ( ! in_array( 'title', $headers ) ) { $results['errors'][] = __( 'CSV file must contain a "title" column.', 'cooked' ); - fclose( $handle ); + fclose( $handle ); // phpcs:ignore WordPress.WP.AlternativeFunctions.file_system_operations_fclose -- CSV row streaming. return $results; } @@ -120,6 +120,7 @@ public static function import_from_file( $file_path ) { } } catch ( Exception $e ) { $error_msg = $e->getMessage(); + /* translators: 1: CSV row number, 2: error message */ $results['errors'][] = sprintf( __( 'Row %1$d: %2$s', 'cooked' ), $row_number, $error_msg ); if ( defined( 'WP_DEBUG' ) && WP_DEBUG ) { @@ -131,7 +132,7 @@ public static function import_from_file( $file_path ) { } } - fclose( $handle ); + fclose( $handle ); // phpcs:ignore WordPress.WP.AlternativeFunctions.file_system_operations_fclose -- CSV row streaming. return $results; } diff --git a/includes/class.cooked-enqueues.php b/includes/class.cooked-enqueues.php index 8cb4671..2f9d67e 100644 --- a/includes/class.cooked-enqueues.php +++ b/includes/class.cooked-enqueues.php @@ -62,22 +62,23 @@ public function enqueues($hook) { wp_enqueue_style('cooked-icons', COOKED_URL . 'assets/css/icons' . $min . '.css', [], COOKED_VERSION); wp_enqueue_style('cooked-styling', COOKED_URL . 'assets/css/style' . $min . '.css', [], COOKED_VERSION ); wp_register_style('cooked-fotorama', COOKED_URL . 'assets/css/fotorama/fotorama.min.css', [], '4.6.4'); - wp_register_script('cooked-fotorama', COOKED_URL . 'assets/js/fotorama/fotorama' . $min . '.js', ['jquery'], '4.6.4'); - wp_register_script('cooked-timer', COOKED_URL . 'assets/js/timer/jquery.simple.timer' . $min . '.js', ['jquery'], '0.0.5'); - wp_register_script('cooked-nosleep', COOKED_URL . 'assets/js/nosleep/NoSleep' . $min . '.js', [], '0.12.0'); + wp_register_script('cooked-fotorama', COOKED_URL . 'assets/js/fotorama/fotorama' . $min . '.js', ['jquery'], '4.6.4', true); + wp_register_script('cooked-timer', COOKED_URL . 'assets/js/timer/jquery.simple.timer' . $min . '.js', ['jquery'], '0.0.5', true); + wp_register_script('cooked-nosleep', COOKED_URL . 'assets/js/nosleep/NoSleep' . $min . '.js', [], '0.12.0', true); // Compatibility with the Bridge Theme. if (!defined('QODE_ROOT')) { - wp_register_script('cooked-appear', COOKED_URL . 'assets/js/appear/jquery.appear' . $min . '.js', ['jquery'], '0.3.6'); + wp_register_script('cooked-appear', COOKED_URL . 'assets/js/appear/jquery.appear' . $min . '.js', ['jquery'], '0.3.6', true); } wp_enqueue_script('wp-sanitize'); - wp_register_script('cooked-functions', COOKED_URL . 'assets/js/cooked-functions' . $min . '.js', ['jquery', 'wp-sanitize'], COOKED_VERSION); + wp_register_script('cooked-functions', COOKED_URL . 'assets/js/cooked-functions' . $min . '.js', ['jquery', 'wp-sanitize'], COOKED_VERSION, true); wp_localize_script('cooked-functions', 'cooked_functions_i18n_js_vars', $cooked_i18n_js_vars); wp_add_inline_script( 'cooked-functions', 'const cooked_functions_js_vars = ' . json_encode( $cooked_js_vars ) . ';', 'before' ); } public function css_colors() { + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Display-only print view flag. if (!isset($_GET['print'])) { $file = COOKED_DIR . 'assets/css/colors.php'; $css = self::get_dynamic_css($file); @@ -86,6 +87,7 @@ public function css_colors() { } public function css_responsive() { + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Display-only print view flag. if (!isset($_GET['print'])) { $file = COOKED_DIR . 'assets/css/responsive.php'; $css = self::get_dynamic_css($file); diff --git a/includes/class.cooked-functions.php b/includes/class.cooked-functions.php index 5b61300..c4ae09e 100644 --- a/includes/class.cooked-functions.php +++ b/includes/class.cooked-functions.php @@ -124,17 +124,17 @@ public static function print_options() { echo '
'; - echo ''; - echo '

' . __( 'Print Options:','cooked') . '

'; - - echo ' '; - echo ' '; - echo ' '; - echo ' '; - echo ' '; - echo ' '; - echo ' '; - echo ' '; + echo ''; + echo '

' . esc_html__( 'Print Options:','cooked') . '

'; + + echo ' '; + echo ' '; + echo ' '; + echo ' '; + echo ' '; + echo ' '; + echo ' '; + echo ' '; echo '
'; } diff --git a/includes/class.cooked-import.php b/includes/class.cooked-import.php index 11d1cd8..33e64b7 100644 --- a/includes/class.cooked-import.php +++ b/includes/class.cooked-import.php @@ -25,8 +25,12 @@ public function __construct() { } public static function init() { - register_setting( 'cooked_import_group', 'cooked_import' ); - register_setting( 'cooked_import_group', 'cooked_import_saved' ); + register_setting( 'cooked_import_group', 'cooked_import', ['sanitize_callback' => [__CLASS__, 'sanitize_saved_flag']] ); + register_setting( 'cooked_import_group', 'cooked_import_saved', ['sanitize_callback' => [__CLASS__, 'sanitize_saved_flag']] ); + } + + public static function sanitize_saved_flag( $value ) { + return rest_sanitize_boolean( $value ); } public static function tabs_fields() { @@ -203,35 +207,35 @@ public static function field_import_button( $name, $field_options, $color, $fiel if ($total > 0) { echo '

'; - echo ''; + echo ''; echo '

'; echo '

'; echo '0 / ' . esc_html( $total ) . ''; echo '

'; - echo '

Import Complete! You can now ' . __( 'reload', 'cooked' ) . ' the import screen.

'; + echo '

Import Complete! You can now ' . esc_html__( 'reload', 'cooked' ) . ' the import screen.

'; } } public static function field_message( $name, $field_options, $color, $field ) { - echo '

' . $field['message'] . '

'; + echo '

' . wp_kses_post( $field['message'] ) . '

'; } public static function field_csv_upload( $name, $field_options, $color, $field ) { - echo '

' . __( 'Download sample CSV files:', 'cooked' ) . ' '; - echo '' . __( 'Small (1 recipe)', 'cooked' ) . ', '; - echo '' . __( 'Medium (3 recipes)', 'cooked' ) . ', '; - echo '' . __( 'Large (10 recipes)', 'cooked' ) . '

'; + echo '

' . esc_html__( 'Download sample CSV files:', 'cooked' ) . ' '; + echo '' . esc_html__( 'Small (1 recipe)', 'cooked' ) . ', '; + echo '' . esc_html__( 'Medium (3 recipes)', 'cooked' ) . ', '; + echo '' . esc_html__( 'Large (10 recipes)', 'cooked' ) . '

'; echo '
'; echo '

'; echo ''; echo '

'; echo '

'; - echo ''; + echo ''; echo '

'; echo '

'; echo ''; echo '

'; - echo ''; + echo ''; echo ''; echo '
'; } diff --git a/includes/class.cooked-measurements.php b/includes/class.cooked-measurements.php index ce70d19..06ea0ed 100644 --- a/includes/class.cooked-measurements.php +++ b/includes/class.cooked-measurements.php @@ -211,6 +211,10 @@ public static function nutrition_facts() { // Use the "cooked_nutrition_facts" filter to add your own nutrition facts. // Reference: https://www.fda.gov/food/nutrition-facts-label/daily-value-nutrition-and-supplement-facts-labels + $unit_g = __( 'g', 'cooked' ); + $unit_mg = __( 'mg', 'cooked' ); + $unit_mcg = __( 'mcg', 'cooked' ); + $nutrition_facts = apply_filters('cooked_nutrition_facts', [ 'top' => [ 'servings' => [ @@ -234,67 +238,67 @@ public static function nutrition_facts() { 'fat' => [ 'name' => __('Total Fat', 'cooked'), 'type' => 'number', - 'measurement' => 'g', + 'measurement' => $unit_g, 'pdv' => apply_filters('cooked_pdv_fat', 78), 'subs' => [ 'sat_fat' => [ 'name' => __('Saturated Fat', 'cooked'), 'type' => 'number', - 'measurement' => 'g', + 'measurement' => $unit_g, 'pdv' => apply_filters('cooked_pdv_satfat', 20) ], 'trans_fat' => [ 'name' => __('Trans Fat', 'cooked'), 'nutrition_info_name' => __('Trans Fat', 'cooked'), 'type' => 'number', - 'measurement' => 'g' + 'measurement' => $unit_g ], 'monounsaturated_fat' => [ 'name' => __('Monounsaturated Fat', 'cooked'), 'type' => 'number', - 'measurement' => 'g' + 'measurement' => $unit_g ], 'polyunsaturated_fat' => [ 'name' => __('Polyunsaturated Fat', 'cooked'), 'type' => 'number', - 'measurement' => 'g' + 'measurement' => $unit_g ] ] ], 'cholesterol' => [ 'name' => __('Cholesterol', 'cooked'), 'type' => 'number', - 'measurement' => 'mg', + 'measurement' => $unit_mg, 'pdv' => apply_filters('cooked_pdv_cholesterol', 300) ], 'sodium' => [ 'name' => __('Sodium', 'cooked'), 'type' => 'number', - 'measurement' => 'mg', + 'measurement' => $unit_mg, 'pdv' => apply_filters('cooked_pdv_sodium', 2300) ], 'carbs' => [ 'name' => (isset($_cooked_settings['carb_format']) && $_cooked_settings['carb_format'] == 'total' ? __('Total Carbohydrate', 'cooked') : __('Net Carbohydrate', 'cooked')), 'type' => 'number', - 'measurement' => 'g', + 'measurement' => $unit_g, 'pdv' => apply_filters('cooked_pdv_carbs', 275), 'subs' => [ 'fiber' => [ 'name' => __('Dietary Fiber', 'cooked'), 'type' => 'number', - 'measurement' => 'g', + 'measurement' => $unit_g, 'pdv' => apply_filters('cooked_pdv_fiber', 28) ], 'sugars' => [ 'name' => __('Total Sugars', 'cooked'), 'type' => 'number', - 'measurement' => 'g', + 'measurement' => $unit_g, //'pdv' => apply_filters('cooked_pdv_sugars', 28) ], 'added_sugars' => [ 'name' => __('Added Sugars', 'cooked'), 'type' => 'number', - 'measurement' => 'g', + 'measurement' => $unit_g, 'pdv' => apply_filters('cooked_pdv_added_sugars', 50) ] ] @@ -302,7 +306,7 @@ public static function nutrition_facts() { 'protein' => [ 'name' => __('Protein', 'cooked'), 'type' => 'number', - 'measurement' => 'g', + 'measurement' => $unit_g, //'pdv' => apply_filters('cooked_pdv_protein', 50) ] ], @@ -311,165 +315,162 @@ public static function nutrition_facts() { 'vitamin_a' => [ 'name' => __('Vitamin A', 'cooked'), 'type' => 'number', - 'measurement' => 'mcg', + 'measurement' => $unit_mcg, 'pdv' => apply_filters('cooked_pdv_vitamin_a', 900) ], 'vitamin_c' => [ 'name' => __('Vitamin C', 'cooked'), 'type' => 'number', - 'measurement' => 'mg', + 'measurement' => $unit_mg, 'pdv' => apply_filters('cooked_pdv_vitamin_c', 90) ], 'calcium' => [ 'name' => __('Calcium', 'cooked'), 'type' => 'number', - 'measurement' => 'mg', + 'measurement' => $unit_mg, 'pdv' => apply_filters('cooked_pdv_calcium', 1300) ], 'iron' => [ 'name' => __('Iron', 'cooked'), 'type' => 'number', - 'measurement' => 'mg', + 'measurement' => $unit_mg, 'pdv' => apply_filters('cooked_pdv_iron', 18) ], 'potassium' => [ 'name' => __('Potassium', 'cooked'), 'type' => 'number', - 'measurement' => 'mg', + 'measurement' => $unit_mg, 'pdv' => apply_filters('cooked_pdv_potassium', 4700) ], 'vitamin_d' => [ 'name' => __('Vitamin D', 'cooked'), 'type' => 'number', - 'measurement' => 'mcg', + 'measurement' => $unit_mcg, 'pdv' => apply_filters('cooked_pdv_vitamin_d', 20) ], 'vitamin_e' => [ 'name' => __('Vitamin E', 'cooked'), 'type' => 'number', - 'measurement' => 'mg', + 'measurement' => $unit_mg, 'pdv' => apply_filters('cooked_pdv_vitamin_e', 15) ], 'vitamin_k' => [ 'name' => __('Vitamin K', 'cooked'), 'type' => 'number', - 'measurement' => 'mcg', + 'measurement' => $unit_mcg, 'pdv' => apply_filters('cooked_pdv_vitamin_k', 120) ], 'thiamin' => [ 'name' => __('Thiamin', 'cooked'), 'type' => 'number', - 'measurement' => 'mg', + 'measurement' => $unit_mg, 'pdv' => apply_filters('cooked_pdv_thiamin', 1.2) ], 'riboflavin' => [ 'name' => __('Riboflavin', 'cooked'), 'type' => 'number', - 'measurement' => 'mg', + 'measurement' => $unit_mg, 'pdv' => apply_filters('cooked_pdv_riboflavin', 1.3) ], 'niacin' => [ 'name' => __('Niacin', 'cooked'), 'type' => 'number', - 'measurement' => 'mg', + 'measurement' => $unit_mg, 'pdv' => apply_filters('cooked_pdv_niacin', 16) ], 'vitamin_b6' => [ 'name' => __('Vitamin B6', 'cooked'), 'type' => 'number', - 'measurement' => 'mg', + 'measurement' => $unit_mg, 'pdv' => apply_filters('cooked_pdv_vitamin_b6', 1.7) ], 'folate' => [ 'name' => __('Folate', 'cooked'), 'type' => 'number', - 'measurement' => 'mcg', + 'measurement' => $unit_mcg, 'pdv' => apply_filters('cooked_pdv_folate', 400) ], 'vitamin_b12' => [ 'name' => __('Vitamin B12', 'cooked'), 'type' => 'number', - 'measurement' => 'mg', + 'measurement' => $unit_mg, 'pdv' => apply_filters('cooked_pdv_vitamin_b12', 2.4) ], 'biotin' => [ 'name' => __('Biotin', 'cooked'), 'type' => 'number', - 'measurement' => 'mcg', + 'measurement' => $unit_mcg, 'pdv' => apply_filters('cooked_pdv_biotin', 30) ], 'pantothenic_acid' => [ 'name' => __('Pantothenic Acid', 'cooked'), 'type' => 'number', - 'measurement' => 'mg', + 'measurement' => $unit_mg, 'pdv' => apply_filters('cooked_pdv_pantothenic_acid', 5) ], 'phosphorus' => [ 'name' => __('Phosphorus', 'cooked'), 'type' => 'number', - 'measurement' => 'mg', + 'measurement' => $unit_mg, 'pdv' => apply_filters('cooked_pdv_phosphorus', 1250) ], 'iodine' => [ 'name' => __('Iodine', 'cooked'), 'type' => 'number', - 'measurement' => 'mcg', + 'measurement' => $unit_mcg, 'pdv' => apply_filters('cooked_pdv_iodine', 150) ], 'magnesium' => [ 'name' => __('Magnesium', 'cooked'), 'type' => 'number', - 'measurement' => 'mg', + 'measurement' => $unit_mg, 'pdv' => apply_filters('cooked_pdv_magnesium', 420) ], 'zinc' => [ 'name' => __('Zinc', 'cooked'), 'type' => 'number', - 'measurement' => 'mg', + 'measurement' => $unit_mg, 'pdv' => apply_filters('cooked_pdv_zinc', 11) ], 'selenium' => [ 'name' => __('Selenium', 'cooked'), 'type' => 'number', - 'measurement' => 'mcg', + 'measurement' => $unit_mcg, 'pdv' => apply_filters('cooked_pdv_selenium', 55) ], 'copper' => [ 'name' => __('Copper', 'cooked'), 'type' => 'number', - 'measurement' => 'mg', + 'measurement' => $unit_mg, 'pdv' => apply_filters('cooked_pdv_copper', 0.9) ], 'manganese' => [ 'name' => __('Manganese', 'cooked'), 'type' => 'number', - 'measurement' => 'mg', + 'measurement' => $unit_mg, 'pdv' => apply_filters('cooked_pdv_manganese', 2.3) ], 'chromium' => [ 'name' => __('Chromium', 'cooked'), 'type' => 'number', - 'measurement' => 'mcg', + 'measurement' => $unit_mcg, 'pdv' => apply_filters('cooked_pdv_chromium', 35) ], 'molybdenum' => [ 'name' => __('Molybdenum', 'cooked'), 'type' => 'number', - 'measurement' => 'mcg', + 'measurement' => $unit_mcg, 'pdv' => apply_filters('cooked_pdv_molybdenum', 45) ], 'chloride' => [ 'name' => __('Chloride', 'cooked'), 'type' => 'number', - 'measurement' => 'mg', + 'measurement' => $unit_mg, 'pdv' => apply_filters('cooked_pdv_chloride', 2300) ] ] ]); - // Ensures "mcg" is in the translation catalog (g and mg are cataloged via get()). - __( 'mcg', 'cooked' ); - return $nutrition_facts; } @@ -718,7 +719,7 @@ public static function time_format( $minutes, $format = 'default' ) { return 'PT0H'.intval( $minutes ).'M'; else: /* translators: singular and plural number of minutes (shorthand) */ - echo self::singular_plural( sprintf( __( '%d min','cooked' ), number_format_i18n($minutes) ), sprintf( __( '%d mins','cooked' ), number_format_i18n($minutes) ), $minutes ); + echo esc_html( self::singular_plural( sprintf( esc_html__( '%d min','cooked' ), number_format_i18n($minutes) ), sprintf( esc_html__( '%d mins','cooked' ), number_format_i18n($minutes) ), $minutes ) ); endif; elseif ( $minutes < 1440 ): $hours = floor( $minutes / 60 ); @@ -727,9 +728,9 @@ public static function time_format( $minutes, $format = 'default' ) { return 'PT'.intval( $hours ).'H'.( $minutes_left ? intval( $minutes_left ) : 0 ).'M'; else: /* translators: singular and plural number of hours (shorthand) */ - echo self::singular_plural( sprintf( __( '%d hr','cooked' ), number_format_i18n($hours) ), sprintf( __( '%d hrs','cooked' ), number_format_i18n($hours) ), $hours ); + echo esc_html( self::singular_plural( sprintf( esc_html__( '%d hr','cooked' ), number_format_i18n($hours) ), sprintf( esc_html__( '%d hrs','cooked' ), number_format_i18n($hours) ), $hours ) ); /* translators: singular and plural number of minutes (shorthand) */ - echo ( $minutes_left ? ' ' . self::singular_plural( sprintf( __( '%d min','cooked' ), number_format_i18n($minutes_left) ), sprintf( __( '%d mins','cooked' ), number_format_i18n($minutes_left) ), $minutes_left ) : '' ); + echo ( $minutes_left ? ' ' . esc_html( self::singular_plural( sprintf( esc_html__( '%d min','cooked' ), number_format_i18n($minutes_left) ), sprintf( esc_html__( '%d mins','cooked' ), number_format_i18n($minutes_left) ), $minutes_left ) ) : '' ); endif; else: $days = floor( $minutes / 24 / 60 ); @@ -743,11 +744,11 @@ public static function time_format( $minutes, $format = 'default' ) { return 'P'.intval( $days ).'DT'.( $hours_left ? intval( $hours_left ) : 0 ).'H'.( $minutes_left ? intval( $minutes_left ) : 0 ).'M'; else: /* translators: singular and plural number of days */ - echo self::singular_plural( sprintf( __( '%d day','cooked' ), number_format_i18n($days) ), sprintf( __( '%d days','cooked' ), number_format_i18n($days) ), $days ); + echo esc_html( self::singular_plural( sprintf( esc_html__( '%d day','cooked' ), number_format_i18n($days) ), sprintf( esc_html__( '%d days','cooked' ), number_format_i18n($days) ), $days ) ); /* translators: singular and plural number of hours (shorthand) */ - echo ( $hours_left ? ' ' . self::singular_plural( sprintf( __( '%d hr','cooked' ), number_format_i18n($hours_left) ), sprintf( __( '%d hrs','cooked' ), number_format_i18n($hours_left) ), $hours_left ) : '' ); + echo ( $hours_left ? ' ' . esc_html( self::singular_plural( sprintf( esc_html__( '%d hr','cooked' ), number_format_i18n($hours_left) ), sprintf( esc_html__( '%d hrs','cooked' ), number_format_i18n($hours_left) ), $hours_left ) ) : '' ); /* translators: singular and plural number of minutes (shorthand) */ - echo ( $minutes_left ? ' ' . self::singular_plural( sprintf( __( '%d min','cooked' ), number_format_i18n($minutes_left) ), sprintf( __( '%d mins','cooked' ), number_format_i18n($minutes_left) ), $minutes_left ) : '' ); + echo ( $minutes_left ? ' ' . esc_html( self::singular_plural( sprintf( esc_html__( '%d min','cooked' ), number_format_i18n($minutes_left) ), sprintf( esc_html__( '%d mins','cooked' ), number_format_i18n($minutes_left) ), $minutes_left ) ) : '' ); endif; endif; diff --git a/includes/class.cooked-migration.php b/includes/class.cooked-migration.php index 3b49039..502de4d 100644 --- a/includes/class.cooked-migration.php +++ b/includes/class.cooked-migration.php @@ -87,8 +87,8 @@ public static function old_recipes_message() { if ($total > 0) { $class = 'notice notice-error'; /* translators: for displaying singular or plural versions depending on the number of recipes. */ - $message = sprintf( esc_html( _n( 'There is %1$s recipe that is from an older version of Cooked. Please %2$s to migrate this recipe.', 'There are %1$s recipes that are from an older version of Cooked. Please %2$s to migrate these recipes.', $total, 'cooked' ) ), '' . number_format( $total ) . '', '' . __( 'click here', 'cooked' ) . '' ); - printf('

%2$s

', esc_attr($class), $message); + $message = sprintf( esc_html( _n( 'There is %1$s recipe that is from an older version of Cooked. Please %2$s to migrate this recipe.', 'There are %1$s recipes that are from an older version of Cooked. Please %2$s to migrate these recipes.', $total, 'cooked' ) ), '' . number_format( $total ) . '', '' . __( 'click here', 'cooked' ) . '' ); + printf('

%2$s

', esc_attr($class), wp_kses_post($message)); } } } @@ -105,6 +105,7 @@ public static function get_cooked_classic_recipes() { 'posts_per_page' => -1, 'post_status' => 'any', 'fields' => 'ids', + // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_query 'meta_query' => [ 'settings_clause' => [ 'key' => '_recipe_settings', diff --git a/includes/class.cooked-multilingual.php b/includes/class.cooked-multilingual.php index be95c69..3f4cfef 100644 --- a/includes/class.cooked-multilingual.php +++ b/includes/class.cooked-multilingual.php @@ -234,7 +234,9 @@ public static function get_missing_translations() { */ public function translation_notice() { // Only show on Cooked settings page - if ( ! isset( $_GET['page'] ) || $_GET['page'] !== 'cooked_settings' ) { + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Display-only admin page query var. + $page = isset( $_GET['page'] ) ? sanitize_key( wp_unslash( $_GET['page'] ) ) : ''; + if ( $page !== 'cooked_settings' ) { return; } @@ -267,7 +269,7 @@ public function translation_notice() { $plugin_name ) . ''; - printf( '

%2$s

', esc_attr( $class ), $message ); + printf( '

%2$s

', esc_attr( $class ), wp_kses_post( $message ) ); } } } diff --git a/includes/class.cooked-pixwell.php b/includes/class.cooked-pixwell.php index fa4f775..5e97f53 100644 --- a/includes/class.cooked-pixwell.php +++ b/includes/class.cooked-pixwell.php @@ -55,9 +55,9 @@ public function forced_dark_mode_notice() { ?>

- - - Auto.', 'cooked' ); ?> + + + Auto.', 'cooked' ), [ 'strong' => [] ] ); ?>

'; - echo the_post_thumbnail( 'thumbnail' ); + echo wp_kses_post( get_the_post_thumbnail( $post_id, 'thumbnail' ) ); echo ''; endif; } @@ -150,7 +151,7 @@ public static function cooked_meta_tags() { $description = ''; if (!empty($recipe_settings['seo_description'])): - $description = wp_strip_all_tags( preg_replace("~(?:\[/?)[^/\]]+/?\]~s", '', $recipe_settings['seo_description']) ); ; + $description = wp_strip_all_tags( preg_replace("~(?:\[/?)[^/\]]+/?\]~s", '', wp_specialchars_decode( $recipe_settings['seo_description'], ENT_QUOTES ) ) ); elseif (!empty($recipe_settings['excerpt'])): $description = wp_strip_all_tags( preg_replace("~(?:\[/?)[^/\]]+/?\]~s", '', $recipe_settings['excerpt']) ); elseif (!empty($recipe_settings['title'])): @@ -164,9 +165,15 @@ public static function cooked_meta_tags() { - ID ) ); ?>"> [ + 'name' => true, + 'content' => true, + 'property' => true, + ], + ] ); } } @@ -190,6 +197,10 @@ public static function activation() { flush_rewrite_rules(); } + public static function deactivation() { + delete_option( 'rewrite_rules' ); + } + public static function init_roles() { // Clean up for any old caps or caps that were inserted incorrectly. if ( $role_object = get_role( 'subscriber' ) ) { @@ -206,8 +217,13 @@ public static function init() { $_cooked_settings = Cooked_Settings::get(); $_cooked_taxonomies = Cooked_Taxonomies::get(); + // phpcs:disable WordPress.Security.NonceVerification.Recommended -- Display-only Settings API query vars. + $page = isset( $_GET['page'] ) ? sanitize_key( wp_unslash( $_GET['page'] ) ) : ''; + $settings_updated = isset( $_GET['settings-updated'] ) ? rest_sanitize_boolean( wp_unslash( $_GET['settings-updated'] ) ) : false; + // phpcs:enable WordPress.Security.NonceVerification.Recommended + // Security check: Only allow settings update from admin area with proper permissions - if (!empty($_GET['settings-updated']) && is_admin() && current_user_can('manage_options') && isset($_GET['page']) && $_GET['page'] === 'cooked_settings') { + if ( $settings_updated && is_admin() && current_user_can('manage_options') && $page === 'cooked_settings' ) { // Recipe Permalink $permalink_parts = explode( '/', $_cooked_settings['recipe_permalink'] ); if ( isset( $permalink_parts[1] ) ): @@ -433,6 +449,7 @@ public static function get() { $has_archive_slug = sanitize_title_with_dashes( __('Recipe Archive', 'cooked') ); $exclude_from_search = false; + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Display-only print view flag. if ( !isset($_GET['print']) && isset( $_cooked_settings['advanced'] ) && in_array( 'disable_public_recipes', $_cooked_settings['advanced'] ) ) { $public_recipes = false; $has_archive_slug = false; @@ -446,8 +463,8 @@ public static function get() { $post_types = apply_filters( 'cooked_post_types', [ 'cp_recipe' => [ 'labels' => [ - 'name' => _x('Recipes', 'cooked'), - 'singular_name' => _x('Recipe', 'cooked'), + 'name' => _x( 'Recipes', 'post type general name', 'cooked' ), + 'singular_name' => _x( 'Recipe', 'post type singular name', 'cooked' ), 'menu_name' => __('Recipes', 'cooked'), 'name_admin_bar' => __('Recipe', 'cooked'), 'add_new' => __('Add New', 'cooked'), diff --git a/includes/class.cooked-recipe-meta.php b/includes/class.cooked-recipe-meta.php index d1fd51c..3d3aa59 100644 --- a/includes/class.cooked-recipe-meta.php +++ b/includes/class.cooked-recipe-meta.php @@ -49,6 +49,9 @@ public static function meta_cleanup( $recipe_settings ) { $decoded_val = wp_specialchars_decode( $val, ENT_QUOTES ); $_recipe_settings[$key] = wp_strip_all_tags( $decoded_val ); } + } elseif ( $key === 'seo_description' ) { + $decoded_val = wp_specialchars_decode( $val, ENT_QUOTES ); + $_recipe_settings[ $key ] = wp_strip_all_tags( $decoded_val ); } else { if ($key === "post_title") { // Decode HTML entities first so wp_kses_post can see actual HTML tags @@ -112,7 +115,10 @@ public static function meta_cleanup( $recipe_settings ) { */ public function add_recipe_meta_box( $post_type ) { // Limit meta box to Cooked Recipes. - $post_types = apply_filters( 'cp_recipe_metabox_post_types' , ['cp_recipe'] ); + $post_types = apply_filters( + 'cooked_recipe_metabox_post_types', + apply_filters( 'cp_recipe_metabox_post_types', [ 'cp_recipe' ] ) + ); if ( in_array( $post_type, $post_types ) ) { add_meta_box( 'cooked_recipe_settings', __( 'Cooked Settings', 'cooked' ), [&$this, 'render_recipe_meta_box'], $post_type, 'normal', 'high' ); @@ -134,8 +140,8 @@ public function save_recipe_meta_box( $post_id ) { // Check if our nonce is set. if ( !isset( $_POST['cooked_recipe_custom_box_nonce'] ) ) return $post_id; - // Verify that the nonce is valid. - if ( ! wp_verify_nonce( $_POST['cooked_recipe_custom_box_nonce'], 'cooked_recipe_custom_box' ) ) return $post_id; + $nonce = wp_unslash( $_POST['cooked_recipe_custom_box_nonce'] ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Verify nonce after unslash; do not sanitize_text_field a nonce. + if ( ! wp_verify_nonce( $nonce, 'cooked_recipe_custom_box' ) ) return $post_id; /* * If this is an autosave, our form has not been submitted, @@ -149,6 +155,7 @@ public function save_recipe_meta_box( $post_id ) { global $recipe_settings; /* OK, it's safe for us to validate/sanitize the data now. */ + // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Sanitized in meta_cleanup(). $recipe_settings = isset($_POST['_recipe_settings']) ? self::meta_cleanup( wp_unslash( $_POST['_recipe_settings'] ) ) : []; if ( isset( $recipe_settings['content'] ) ) { @@ -160,6 +167,9 @@ public function save_recipe_meta_box( $post_id ) { if ( isset( $recipe_settings['notes'] ) ) { $recipe_settings['notes'] = str_replace( ["\r\n", "\r"], "\n", $recipe_settings['notes'] ); } + if ( isset( $recipe_settings['seo_description'] ) ) { + $recipe_settings['seo_description'] = str_replace( ["\r\n", "\r"], "\n", $recipe_settings['seo_description'] ); + } // Directions if ( isset( $recipe_settings['directions'] ) ) { @@ -213,9 +223,12 @@ public function recipe_embed_shortcode_admin_notice() { printf( '

%s

', - sprintf( - __( 'This recipe is set up to include itself in the Recipe Template (containing shortcode %s), which can break the page. Remove the embed that references this same recipe.', 'cooked' ), - $shortcode + wp_kses_post( + sprintf( + /* translators: %s: recipe embed shortcode */ + __( 'This recipe is set up to include itself in the Recipe Template (containing shortcode %s), which can break the page. Remove the embed that references this same recipe.', 'cooked' ), + '' . esc_html( $shortcode ) . '' + ) ) ); } @@ -255,19 +268,19 @@ public static function bulk_add_modal() { ×
-

+

@@ -285,8 +298,8 @@ function cooked_recipe_shortcodes_content() {
-

-

+

+

@@ -298,8 +311,8 @@ function cooked_recipe_shortcodes_content() {
-

-

+

+

@@ -307,14 +320,14 @@ function cooked_recipe_shortcodes_content() {

"style"

-

+

"width"

-

+

@@ -324,14 +337,14 @@ function cooked_recipe_shortcodes_content() {

"hide_excerpt"

-

+

"hide_author"

-

+

@@ -341,14 +354,14 @@ function cooked_recipe_shortcodes_content() {

"hide_image"

-

+

"hide_title"

-

+

@@ -358,17 +371,17 @@ function cooked_recipe_shortcodes_content() {
-

+

- id ()
- width ()
- style ()
- hide_image ()
- hide_title ()
- hide_excerpt ()
- hide_author () + id ()
+ width ()
+ style ()
+ hide_image ()
+ hide_title ()
+ hide_excerpt ()
+ hide_author ()

-

+

[cooked-recipe-card id="" width="300px" style="modern"]

@@ -488,15 +501,15 @@ function cooked_render_recipe_fields( $post_id ) {
- +
-

+

@@ -504,8 +517,8 @@ function cooked_render_recipe_fields( $post_id ) {
-

-

+

+

@@ -519,7 +532,7 @@ function cooked_render_recipe_fields( $post_id ) {
-

' . __( 'Default Recipe Template','cooked') . '' . __( 'Choose from the options below to use this layout as the default for new recipes or for all recipes.', 'cooked') . '' . __( 'Save as Default','cooked' ) . '  ' . __( 'Apply to All','cooked' ) . '0 / 0' ); ?>" class="button cooked-layout-save-default">' . __( 'Recipe Template','cooked') . '' . __( '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.','cooked') ); ?>">

+

' . esc_html__( 'Default Recipe Template','cooked') . '' . esc_html__( 'Choose from the options below to use this layout as the default for new recipes or for all recipes.', 'cooked') . '' . esc_html__( 'Save as Default','cooked' ) . '  ' . esc_html__( 'Apply to All','cooked' ) . '0 / 0' ); ?>" class="button cooked-layout-save-default">' . esc_html__( 'Recipe Template','cooked') . '' . esc_html__( '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.','cooked') ); ?>">

@@ -537,7 +550,7 @@ function cooked_render_recipe_fields( $post_id ) {
-

+

@@ -560,8 +573,8 @@ function cooked_render_recipe_fields( $post_id ) {

-

-

+

+

@@ -571,7 +584,7 @@ function cooked_render_recipe_fields( $post_id ) {
-

+

-

+

- +
-

+

- +
-

+

- +
-

+

- - - + + +
@@ -663,7 +676,7 @@ function cooked_render_recipe_fields( $post_id ) {
- +
@@ -672,7 +685,7 @@ function cooked_render_recipe_fields( $post_id ) {
- +
@@ -685,7 +698,7 @@ function cooked_render_recipe_fields( $post_id ) {
- +
@@ -696,11 +709,11 @@ function cooked_render_recipe_fields( $post_id ) {
- +
- + +
@@ -764,7 +777,7 @@ function cooked_render_recipe_fields( $post_id ) {
- +
@@ -777,7 +790,7 @@ function cooked_render_recipe_fields( $post_id ) {
- +
@@ -791,10 +804,10 @@ function cooked_render_recipe_fields( $post_id ) {

- -   + +   -   +  

@@ -822,7 +835,7 @@ function cooked_render_recipe_fields( $post_id ) {
- +
@@ -831,7 +844,7 @@ function cooked_render_recipe_fields( $post_id ) {
- +
@@ -844,7 +857,7 @@ function cooked_render_recipe_fields( $post_id ) {
- +
@@ -852,11 +865,11 @@ function cooked_render_recipe_fields( $post_id ) {
- +
- + - - ' ); ?> + + ' ); ?>
@@ -919,7 +932,7 @@ function cooked_render_recipe_fields( $post_id ) {
- + @@ -936,11 +949,11 @@ function cooked_render_recipe_fields( $post_id ) {
- +
- + @@ -975,34 +988,34 @@ function cooked_render_recipe_fields( $post_id ) { 1
- - - + + +
- +
true, 'media_buttons' => false, 'wpautop' => false, 'editor_height' => 250, - 'textarea_name' => '_recipe_settings[directions][' . $random_key . '][content]', + 'textarea_name' => '_recipe_settings[directions][' . esc_attr( $random_key ) . '][content]', 'quicktags' => true ]); ?> - +
- - + +
- +
@@ -1015,10 +1028,10 @@ function cooked_render_recipe_fields( $post_id ) {

- -   + +   -   +  

@@ -1027,7 +1040,7 @@ function cooked_render_recipe_fields( $post_id ) {
- +
@@ -1037,7 +1050,7 @@ function cooked_render_recipe_fields( $post_id ) {
- +
@@ -1047,11 +1060,11 @@ function cooked_render_recipe_fields( $post_id ) {
- +
- + @@ -1082,7 +1095,7 @@ function cooked_render_recipe_fields( $post_id ) {
-

+

@@ -1120,7 +1133,7 @@ function cooked_render_recipe_fields( $post_id ) {
-

+

      -
    • +
    • $nf ): @@ -1148,14 +1161,14 @@ function cooked_render_recipe_fields( $post_id ) { endforeach; ?>
    • -
    • +
    • $nf ): echo '
    • '; - echo '' . esc_html($nf['name']) . ' ___' . ( isset($nf['measurement']) ? '' . esc_html__( $nf['measurement'], 'cooked' ) . '' : '' ); + echo '' . esc_html($nf['name']) . ' ___' . ( isset($nf['measurement']) ? '' . esc_html( $nf['measurement'] ) . '' : '' ); echo ( isset( $nf['pdv'] ) ? '0%' : '' ); if ( isset($nf['subs']) ): @@ -1163,16 +1176,16 @@ function cooked_render_recipe_fields( $post_id ) { echo '
        '; if ($sub_slug === 'trans_fat'): echo '
      • '; - echo $sub_nf['nutrition_info_name'] . ' ___' . ( isset($sub_nf['measurement']) ? '' . esc_html__( $sub_nf['measurement'], 'cooked' ) . '' : '' ); + echo wp_kses_post( $sub_nf['nutrition_info_name'] ) . ' ___' . ( isset($sub_nf['measurement']) ? '' . esc_html( $sub_nf['measurement'] ) . '' : '' ); echo '
      • '; elseif ($sub_slug === 'added_sugars'): echo '
        • '; - echo __('Includes', 'cooked') . ' ___' . ( isset($sub_nf['measurement']) ? '' . esc_html__( $sub_nf['measurement'], 'cooked' ) . '' : '' ) . ' ' . esc_html($sub_nf['name']); + echo esc_html__('Includes', 'cooked') . ' ___' . ( isset($sub_nf['measurement']) ? '' . esc_html( $sub_nf['measurement'] ) . '' : '' ) . ' ' . esc_html($sub_nf['name']); echo ( isset( $sub_nf['pdv'] ) ? '0%' : '' ); echo '
        '; else: echo '
      • '; - echo $sub_nf['name'] . ' ___' . ( isset($sub_nf['measurement']) ? '' . esc_html__( $sub_nf['measurement'], 'cooked' ) . '' : '' ); + echo esc_html( $sub_nf['name'] ) . ' ___' . ( isset($sub_nf['measurement']) ? '' . esc_html( $sub_nf['measurement'] ) . '' : '' ); echo ( isset( $sub_nf['pdv'] ) ? '0%' : '' ); echo '
      • '; endif; @@ -1189,7 +1202,7 @@ function cooked_render_recipe_fields( $post_id ) { $nf ): echo '
      • '; - echo $nf['name'] . ' ___' . ( isset($nf['measurement']) ? '' . esc_html__( $nf['measurement'], 'cooked' ) . '' : '' ); + echo esc_html( $nf['name'] ) . ' ___' . ( isset($nf['measurement']) ? '' . esc_html( $nf['measurement'] ) . '' : '' ); echo ( isset( $nf['pdv'] ) ? '0%' : '' ); echo '
      • '; endforeach; ?> @@ -1199,14 +1212,14 @@ function cooked_render_recipe_fields( $post_id ) {
      -

      *

      +

      *

- +
@@ -1215,7 +1228,7 @@ function cooked_render_recipe_fields( $post_id ) {
-

+

- + $g ): echo ''; endforeach; ?> @@ -1242,16 +1255,16 @@ function cooked_render_recipe_fields( $post_id ) {

-

+

'; + echo ''; endforeach; endif; ?>
- +
@@ -1282,8 +1295,8 @@ function cooked_render_recipe_fields( $post_id ) {
-

-

+

+

@@ -1292,9 +1305,9 @@ function cooked_render_recipe_fields( $post_id ) {

-

+

@@ -1302,8 +1315,8 @@ function cooked_render_recipe_fields( $post_id ) {

-

+ echo sprintf( esc_html__( '"%1$s" and "%2$s"','cooked' ), 'left','right' ); ?>

+

@@ -1313,7 +1326,7 @@ function cooked_render_recipe_fields( $post_id ) {
-

+

__('Difficulty', 'cooked'), 'servings' => __('Servings Switcher', 'cooked'), 'taxonomies' => __('Category', 'cooked'), - 'print' => __('Print Mode', 'cooked'), + 'print' => esc_html__('Print Mode', 'cooked'), 'fullscreen' => __('Full-Screen Mode', 'cooked') ]); @@ -1344,14 +1357,14 @@ function cooked_render_recipe_fields( $post_id ) {

-

-

+

+

"checkboxes"

-

+

@@ -1359,10 +1372,10 @@ function cooked_render_recipe_fields( $post_id ) {
-

+

- true ()
- false () + true ()
+ false ()

@@ -1375,14 +1388,14 @@ function cooked_render_recipe_fields( $post_id ) {
-

-

+

+

"numbers"

-

+

@@ -1390,10 +1403,10 @@ function cooked_render_recipe_fields( $post_id ) {
-

+

- true ()
- false () + true ()
+ false ()

@@ -1406,8 +1419,8 @@ function cooked_render_recipe_fields( $post_id ) {
-

-

+

+

@@ -1415,9 +1428,9 @@ function cooked_render_recipe_fields( $post_id ) {
-

+

- +

@@ -1430,8 +1443,8 @@ function cooked_render_recipe_fields( $post_id ) {
-

-

+

+

@@ -1439,9 +1452,9 @@ function cooked_render_recipe_fields( $post_id ) {
-

+

- +

@@ -1456,8 +1469,8 @@ function cooked_render_recipe_fields( $post_id ) {
-

-

+

+

@@ -1465,14 +1478,14 @@ function cooked_render_recipe_fields( $post_id ) {

"width"

-

+

"ratio"

-

+

@@ -1482,14 +1495,14 @@ function cooked_render_recipe_fields( $post_id ) {

"nav"

-

+

"allowfullscreen"

-

+

@@ -1499,27 +1512,27 @@ function cooked_render_recipe_fields( $post_id ) {
-

+

width


ratio


nav


allowfullscreen

@@ -1535,8 +1548,8 @@ function cooked_render_recipe_fields( $post_id ) {
-

-

+

+

@@ -1544,9 +1557,9 @@ function cooked_render_recipe_fields( $post_id ) {
-

+

- +

@@ -1559,14 +1572,14 @@ function cooked_render_recipe_fields( $post_id ) {
-

-

+

+

"show_header"

-

+

@@ -1574,10 +1587,10 @@ function cooked_render_recipe_fields( $post_id ) {
-

+

- true ()
- false () + true ()
+ false ()

@@ -1590,8 +1603,8 @@ function cooked_render_recipe_fields( $post_id ) {
-

-

+

+

' />
@@ -1600,16 +1613,16 @@ function cooked_render_recipe_fields( $post_id ) {

-

+

"desc"

-

+

@@ -1619,12 +1632,12 @@ function cooked_render_recipe_fields( $post_id ) {
-

+

- seconds ()
- minutes ()
- hours ()
- desc () + seconds ()
+ minutes ()
+ hours ()
+ desc ()

@@ -1637,19 +1650,19 @@ function cooked_render_recipe_fields( $post_id ) {
-

-

+

+

-

+

-

+

- +

@@ -1662,8 +1675,8 @@ function cooked_render_recipe_fields( $post_id ) {
-

-

+

+

@@ -1671,14 +1684,14 @@ function cooked_render_recipe_fields( $post_id ) {

"id"

-

+

"title"

-

+

@@ -1688,14 +1701,14 @@ function cooked_render_recipe_fields( $post_id ) {

"limit"

-

+

"columns"

-

+

@@ -1705,14 +1718,14 @@ function cooked_render_recipe_fields( $post_id ) {

"hide_image"

-

+

"hide_excerpt"

-

+

@@ -1722,38 +1735,38 @@ function cooked_render_recipe_fields( $post_id ) {

"hide_author"

-

+

"match_*"

-

+

-

-

+

+

-

+

- id ()
- title ()
- limit ()
- columns ()
- hide_image ()
- hide_excerpt ()
- hide_author ()
- match_* () + id ()
+ title ()
+ limit ()
+ columns ()
+ hide_image ()
+ hide_excerpt ()
+ hide_author ()
+ match_* ()

-

+

[cooked-related-recipes limit="4" columns="2" title="Related Recipes"]

diff --git a/includes/class.cooked-recipes.php b/includes/class.cooked-recipes.php index 0c52211..812b65e 100644 --- a/includes/class.cooked-recipes.php +++ b/includes/class.cooked-recipes.php @@ -222,7 +222,9 @@ public function check_recipe_query() { global $_cooked_settings, $recipe_query; if ( !isset($recipe_query['cp_recipe_category']) ): - $recipe_query['cp_recipe_category'] = ( isset($_GET['cp_recipe_category']) && $_GET['cp_recipe_category'] ? intval($_GET['cp_recipe_category']) : ( isset($_cooked_settings['browse_default_cp_recipe_category']) && $_cooked_settings['browse_default_cp_recipe_category'] ? $_cooked_settings['browse_default_cp_recipe_category'] : false ) ); + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Display-only browse category filter. + $requested_category = isset( $_GET['cp_recipe_category'] ) ? absint( wp_unslash( $_GET['cp_recipe_category'] ) ) : 0; + $recipe_query['cp_recipe_category'] = $requested_category ? $requested_category : ( isset($_cooked_settings['browse_default_cp_recipe_category']) && $_cooked_settings['browse_default_cp_recipe_category'] ? $_cooked_settings['browse_default_cp_recipe_category'] : false ); endif; } @@ -237,7 +239,7 @@ public static function cooked_pre_get_posts( $q ) { // Modified WHERE $sql['where'] = sprintf( " AND ( %s OR %s ) ", - apply_filters( 'cooked_query_where_filter', $wpdb->prepare( "{$wpdb->posts}.post_title like '%%%s%%'", $wpdb->esc_like( $title ) ) ), + apply_filters( 'cooked_query_where_filter', $wpdb->prepare( "{$wpdb->posts}.post_title LIKE %s", '%' . $wpdb->esc_like( $title ) . '%' ) ), mb_substr( $sql['where'], 5, mb_strlen( $sql['where'] ) ) ); @@ -285,7 +287,7 @@ public static function recipe_list( $orderby = 'date', $show = 5, $recipes = fal echo '
'; - echo has_post_thumbnail($rid) && !$hide_image ? '' : ''; + echo has_post_thumbnail($rid) && !$hide_image ? '' : ''; echo '
'; @@ -295,7 +297,7 @@ public static function recipe_list( $orderby = 'date', $show = 5, $recipes = fal echo '
'; $author = $recipe['author']; /* translators: stating the recipe author with a "By" in front of it. (ex: "By John Smith") */ - echo sprintf( __( 'By %s', 'cooked' ), '' . wp_kses_post( $author['name'] ) . '' ); + echo sprintf( esc_html__( 'By %s', 'cooked' ), '' . wp_kses_post( $author['name'] ) . '' ); echo '
'; endif; @@ -329,7 +331,7 @@ public static function card( $rid, $width = false, $hide_image = false, $hide_ti do_action( 'cooked_recipe_grid_before_image', $recipe ); - echo has_post_thumbnail($rid) && !$hide_image ? '' : ''; + echo has_post_thumbnail($rid) && !$hide_image ? '' : ''; //do_action( 'cooked_recipe_grid_after_image', $recipe ); @@ -349,7 +351,7 @@ public static function card( $rid, $width = false, $hide_image = false, $hide_ti echo ''; $author = $recipe['author']; /* translators: stating the recipe author with a "By" in front of it. (ex: "By John Smith") */ - echo sprintf( __( 'By %s', 'cooked' ), '' . $author['name'] . '' ); + echo wp_kses_post( sprintf( __( 'By %s', 'cooked' ), '' . esc_html( $author['name'] ) . '' ) ); echo ''; endif; @@ -373,6 +375,7 @@ public static function card( $rid, $width = false, $hide_image = false, $hide_ti } public function print_recipe_template() { + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Display-only print view flag. if ( is_singular('cp_recipe') && isset($_GET['print']) ): load_template( COOKED_DIR . 'templates/front/recipe-print.php', false); exit; @@ -437,7 +440,8 @@ public function filter_recipes_by_taxonomy() { foreach ( $taxonomies as $taxonomy ): if ( is_array($cooked_taxonomies_shown) && !in_array( $taxonomy, $cooked_taxonomies_shown ) || !is_array($cooked_taxonomies_shown) ): $cooked_taxonomies_shown[] = $taxonomy; - $selected = isset($_GET[$taxonomy]) ? sanitize_title($_GET[$taxonomy]) : ''; + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Display-only admin taxonomy filter. + $selected = isset( $_GET[ $taxonomy ] ) ? absint( wp_unslash( $_GET[ $taxonomy ] ) ) : ''; $info_taxonomy = get_taxonomy($taxonomy); $taxonomy_label = $info_taxonomy->label; @@ -918,7 +922,6 @@ public static function gallery_types() { endforeach; - wp_reset_query(); wp_reset_postdata(); return $gallery_types; @@ -927,6 +930,7 @@ public static function gallery_types() { public static function measurement_system_switcher() { global $_cooked_settings, $post; $switcher_enabled = ( isset( $_cooked_settings['advanced'] ) && in_array( 'enable_measurement_switcher', $_cooked_settings['advanced'] ) ? true : false ); + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Display-only print view flag. $printing = ( is_singular('cp_recipe') && isset($_GET['print']) ); if ( !$printing && $switcher_enabled ): @@ -938,13 +942,13 @@ public static function measurement_system_switcher() { ]; $current_label = isset( $labels[ $current ] ) ? $labels[ $current ] : $labels['']; echo ''; - echo '' . __( 'Units', 'cooked' ) . ''; + echo '' . esc_html__( 'Units', 'cooked' ) . ''; echo '' . esc_html( $current_label ) . ''; - echo ''; + echo ''; echo ''; echo ''; endif; @@ -953,6 +957,7 @@ public static function measurement_system_switcher() { public static function serving_size_switcher( $servings ) { global $_cooked_settings, $post; $switcher_disabled = ( isset( $_cooked_settings['advanced'] ) && in_array( 'disable_servings_switcher', $_cooked_settings['advanced'] ) ? true : false ); + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Display-only print view flag. $printing = ( is_singular('cp_recipe') && isset($_GET['print']) ); if ( !$printing && !$switcher_disabled ): @@ -993,22 +998,22 @@ public static function serving_size_switcher( $servings ) { endif; echo ''; - echo '' . __('Yields','cooked') . ''; + echo '' . esc_html__('Yields','cooked') . ''; if ( !$printing && !$switcher_disabled ): /* translators: singular and plural "serving" sizes */ $servings_string = sprintf( esc_html( _n( '%s Serving', '%s Servings', $servings, 'cooked' ) ), $servings ); - echo '' . $servings_string . ''; - echo ''; + echo '' . esc_html( $servings_string ) . ''; + echo ''; echo ''; else: /* translators: singular and plural "serving" sizes */ - echo '' . sprintf( esc_html( _n( '%s Serving', '%s Servings', $servings, 'cooked' ) ), $servings ) . ''; + echo '' . esc_html( sprintf( _n( '%s Serving', '%s Servings', $servings, 'cooked' ), $servings ) ) . ''; endif; echo ''; @@ -1035,7 +1040,7 @@ public static function single_ingredient( $ing, $checkboxes = true, $plain_text ? ($ing['section_heading_element'] === 'div' ? $default_element : $ing['section_heading_element']) : $default_element; - echo '<' . $element . ' class="cooked-single-ingredient cooked-heading">' . esc_html($ing['section_heading_name']) . ''; + echo '<' . tag_escape( $element ) . ' class="cooked-single-ingredient cooked-heading">' . esc_html($ing['section_heading_name']) . ''; } } elseif ( isset($ing['name']) && $ing['name'] ) { @@ -1154,7 +1159,7 @@ public static function single_ingredient( $ing, $checkboxes = true, $plain_text if ( $sub_name ) { echo ''; - echo ' ' . __('or', 'cooked') . ' '; + echo ' ' . esc_html__('or', 'cooked') . ' '; echo ( $sub_amount ? '' . wp_kses_post($sub_amount) . ' ' . wp_kses_post( $sub_measurement ) . ' ' : '' ); echo '' . wp_kses_post( $sub_name ) . ''; echo ''; @@ -1164,7 +1169,7 @@ public static function single_ingredient( $ing, $checkboxes = true, $plain_text } $ing_html = ob_get_clean(); - echo apply_filters( 'cooked_single_ingredient_html', $ing_html, $ing, $checkboxes, $plain_text ); + echo wp_kses_post( apply_filters( 'cooked_single_ingredient_html', $ing_html, $ing, $checkboxes, $plain_text ) ); } public static function single_direction($dir, $number = false, $plain_text = false, $step = false, $atts = false) { @@ -1183,7 +1188,7 @@ public static function single_direction($dir, $number = false, $plain_text = fal ? ($dir['section_heading_element'] === 'div' ? $default_element : $dir['section_heading_element']) : $default_element; - echo '<' . $element . ' class="cooked-single-direction cooked-heading">' . esc_html($dir['section_heading_name']) . ''; + echo '<' . tag_escape( $element ) . ' class="cooked-single-direction cooked-heading">' . esc_html($dir['section_heading_name']) . ''; } } elseif ( !empty($dir['content']) || !empty($dir['image']) || !empty($dir['video']) ) { @@ -1201,9 +1206,9 @@ public static function single_direction($dir, $number = false, $plain_text = fal /* translators: singular and plural "steps" */ $step_string = sprintf( __( 'Step %d', 'cooked' ), $step ); - echo '
'; + echo '
'; echo $number ? '' . esc_html($number) . '' : ''; - echo '
' . do_shortcode($content) . ($image ? wpautop($image) : '') . ($video ? '' : '') . '
'; + echo '
' . do_shortcode($content) . ($image ? wp_kses_post( wpautop($image) ) : '') . ($video ? '' : '') . '
'; echo '
'; } } @@ -1259,7 +1264,7 @@ public static function recipe_search_box( $options = false ) { echo '
'; echo ''; - echo '' . ( isset($active_taxonomy) ? esc_html( $active_taxonomy ) : __('Browse','cooked') ) . ''; + echo '' . ( isset($active_taxonomy) ? esc_html( $active_taxonomy ) : esc_html__('Browse','cooked') ) . ''; echo ''; endif; @@ -1280,15 +1285,15 @@ public static function recipe_search_box( $options = false ) { $terms_array = Cooked_Settings::terms_array( 'cp_recipe_category', false, __('No categories','cooked'), true, true, false ); if ( !empty($terms_array) ): echo ''; - echo '' . __('Categories','cooked') . ''; + echo '' . esc_html__('Categories','cooked') . ''; echo '
'; - echo ( $view_all_recipes_url ? '' . __( 'All Categories','cooked' ) . '' : '' ); + echo ( $view_all_recipes_url ? '' . esc_html__( 'All Categories','cooked' ) . '' : '' ); foreach ( $terms_array as $key => $val ): if ( $key ): $term = get_term( $key ); $term_link = ( !empty($term) ? get_term_link( $term ) : false ); $term_name = apply_filters( 'cooked_term_name', $term->name, $term->ID, $term->taxonomy ); - echo ( $term_link ? ( isset($active_taxonomy) && $active_taxonomy == $val ? '  ' : '' ) . '' . esc_html($term_name) . '' . ( isset($active_taxonomy) && $active_taxonomy == $val ? '' : '' ) : '' ); + echo ( $term_link ? ( isset($active_taxonomy) && $active_taxonomy == $val ? '  ' : '' ) . '' . wp_kses_post($term_name) . '' . ( isset($active_taxonomy) && $active_taxonomy == $val ? '' : '' ) : '' ); $total_taxonomies++; $sub_terms_array = Cooked_Settings::terms_array( 'cp_recipe_category', false, false, true, false, $key ); if ( !empty($sub_terms_array) ): @@ -1297,7 +1302,7 @@ public static function recipe_search_box( $options = false ) { $sub_term = get_term( $sub_key ); $sub_term_link = ( !empty($sub_term) ? get_term_link( $sub_term ) : false ); $sub_term_name = apply_filters( 'cooked_term_name', $sub_term->name, $sub_term->ID, $sub_term->taxonomy ); - echo ( $sub_term_link ? '' . ( isset($active_taxonomy) && $active_taxonomy == $sub_val ? '  ' : '' ) . '' . esc_html($sub_term_name) . '' . ( isset($active_taxonomy) && $active_taxonomy == $sub_val ? '' : '' ) . '' : '' ); + echo ( $sub_term_link ? '' . ( isset($active_taxonomy) && $active_taxonomy == $sub_val ? '  ' : '' ) . '' . wp_kses_post($sub_term_name) . '' . ( isset($active_taxonomy) && $active_taxonomy == $sub_val ? '' : '' ) . '' : '' ); $total_taxonomies++; endif; endforeach; @@ -1351,11 +1356,11 @@ public static function recipe_search_box( $options = false ) { echo '
'; - echo !$options['hide_browse'] && $taxonomy_search_fields ? $taxonomy_search_fields : ''; + echo !$options['hide_browse'] && $taxonomy_search_fields ? wp_kses_post( $taxonomy_search_fields ) : ''; - echo ''; + echo ''; - echo ''; + echo ''; echo '
'; diff --git a/includes/class.cooked-seo.php b/includes/class.cooked-seo.php index 5c8d4f3..613048e 100644 --- a/includes/class.cooked-seo.php +++ b/includes/class.cooked-seo.php @@ -80,6 +80,7 @@ public static function schema_values( $recipe = false ) { $directions[] = [ '@type' => 'HowToStep', + /* translators: %d: step number */ 'name' => sprintf(__('Step %d', 'cooked'), $number), 'text' => $direction_cleaned, 'url' => get_permalink($rpost) . '#cooked-single-direction-step-' . $number, @@ -107,14 +108,14 @@ public static function schema_values( $recipe = false ) { $unsaturatedFatAmount = (isset($recipe['nutrition']['monounsaturated_fat']) && $recipe['nutrition']['monounsaturated_fat'] ? $recipe['nutrition']['monounsaturated_fat'] : 0) + (isset($recipe['nutrition']['polyunsaturated_fat']) && $recipe['nutrition']['polyunsaturated_fat'] ? $recipe['nutrition']['polyunsaturated_fat'] : 0); if ($unsaturatedFatAmount): - $unsaturatedFatContent = $unsaturatedFatAmount . ' ' . __( $_nutrition_facts['main']['fat']['subs']['monounsaturated_fat']['measurement'], 'cooked' ); + $unsaturatedFatContent = $unsaturatedFatAmount . ' ' . $_nutrition_facts['main']['fat']['subs']['monounsaturated_fat']['measurement']; else: $unsaturatedFatContent = ''; endif; $description = ''; if (!empty($recipe['seo_description'])): - $description = wp_strip_all_tags( preg_replace("~(?:\[/?)[^/\]]+/?\]~s", '', $recipe['seo_description']) ); ; + $description = wp_strip_all_tags( preg_replace("~(?:\[/?)[^/\]]+/?\]~s", '', wp_specialchars_decode( $recipe['seo_description'], ENT_QUOTES ) ) ); elseif (!empty($recipe['excerpt'])): $description = wp_strip_all_tags( preg_replace("~(?:\[/?)[^/\]]+/?\]~s", '', $recipe['excerpt']) ); elseif (!empty($recipe['title'])): @@ -147,16 +148,16 @@ public static function schema_values( $recipe = false ) { 'nutrition' => [ '@type' => 'NutritionInformation', 'calories' => (isset($recipe['nutrition']['calories']) && $recipe['nutrition']['calories'] ? $recipe['nutrition']['calories'] . ' ' . strtolower($_nutrition_facts['mid']['calories']['name']) : 0), - 'carbohydrateContent' => (isset($recipe['nutrition']['carbs']) && $recipe['nutrition']['carbs'] ? $recipe['nutrition']['carbs'] . ' ' . __( $_nutrition_facts['main']['carbs']['measurement'], 'cooked' ) : ''), - 'cholesterolContent' => (isset($recipe['nutrition']['cholesterol']) && $recipe['nutrition']['cholesterol'] ? $recipe['nutrition']['cholesterol'] . ' ' . __( $_nutrition_facts['main']['cholesterol']['measurement'], 'cooked' ) : ''), - 'fatContent' => (isset($recipe['nutrition']['fat']) && $recipe['nutrition']['fat'] ? $recipe['nutrition']['fat'] . ' ' . __( $_nutrition_facts['main']['fat']['measurement'], 'cooked' ) : ''), - 'fiberContent' => (isset($recipe['nutrition']['fiber']) && $recipe['nutrition']['fiber'] ? $recipe['nutrition']['fiber'] . ' ' . __( $_nutrition_facts['main']['carbs']['subs']['fiber']['measurement'], 'cooked' ) : ''), - 'proteinContent' => (isset($recipe['nutrition']['protein']) && $recipe['nutrition']['protein'] ? $recipe['nutrition']['protein'] . ' ' . __( $_nutrition_facts['main']['protein']['measurement'], 'cooked' ) : ''), - 'saturatedFatContent' => (isset($recipe['nutrition']['sat_fat']) && $recipe['nutrition']['sat_fat'] ? $recipe['nutrition']['sat_fat'] . ' ' . __( $_nutrition_facts['main']['fat']['subs']['sat_fat']['measurement'], 'cooked' ) : ''), + 'carbohydrateContent' => (isset($recipe['nutrition']['carbs']) && $recipe['nutrition']['carbs'] ? $recipe['nutrition']['carbs'] . ' ' . $_nutrition_facts['main']['carbs']['measurement'] : ''), + 'cholesterolContent' => (isset($recipe['nutrition']['cholesterol']) && $recipe['nutrition']['cholesterol'] ? $recipe['nutrition']['cholesterol'] . ' ' . $_nutrition_facts['main']['cholesterol']['measurement'] : ''), + 'fatContent' => (isset($recipe['nutrition']['fat']) && $recipe['nutrition']['fat'] ? $recipe['nutrition']['fat'] . ' ' . $_nutrition_facts['main']['fat']['measurement'] : ''), + 'fiberContent' => (isset($recipe['nutrition']['fiber']) && $recipe['nutrition']['fiber'] ? $recipe['nutrition']['fiber'] . ' ' . $_nutrition_facts['main']['carbs']['subs']['fiber']['measurement'] : ''), + 'proteinContent' => (isset($recipe['nutrition']['protein']) && $recipe['nutrition']['protein'] ? $recipe['nutrition']['protein'] . ' ' . $_nutrition_facts['main']['protein']['measurement'] : ''), + 'saturatedFatContent' => (isset($recipe['nutrition']['sat_fat']) && $recipe['nutrition']['sat_fat'] ? $recipe['nutrition']['sat_fat'] . ' ' . $_nutrition_facts['main']['fat']['subs']['sat_fat']['measurement'] : ''), 'servingSize' => (isset($recipe['nutrition']['serving_size']) && $recipe['nutrition']['serving_size'] ? $recipe['nutrition']['serving_size'] . ' ' . strtolower($_nutrition_facts['top']['servings']['name']) : ''), - 'sodiumContent' => (isset($recipe['nutrition']['sodium']) && $recipe['nutrition']['sodium'] ? $recipe['nutrition']['sodium'] . ' ' . __( $_nutrition_facts['main']['sodium']['measurement'], 'cooked' ) : ''), - 'sugarContent' => (isset($recipe['nutrition']['sugars']) && $recipe['nutrition']['sugars'] ? $recipe['nutrition']['sugars'] . ' ' . __( $_nutrition_facts['main']['carbs']['subs']['sugars']['measurement'], 'cooked' ) : ''), - 'transFatContent' => (isset($recipe['nutrition']['trans_fat']) && $recipe['nutrition']['trans_fat'] ? $recipe['nutrition']['trans_fat'] . ' ' . __( $_nutrition_facts['main']['fat']['subs']['trans_fat']['measurement'], 'cooked' ) : ''), + 'sodiumContent' => (isset($recipe['nutrition']['sodium']) && $recipe['nutrition']['sodium'] ? $recipe['nutrition']['sodium'] . ' ' . $_nutrition_facts['main']['sodium']['measurement'] : ''), + 'sugarContent' => (isset($recipe['nutrition']['sugars']) && $recipe['nutrition']['sugars'] ? $recipe['nutrition']['sugars'] . ' ' . $_nutrition_facts['main']['carbs']['subs']['sugars']['measurement'] : ''), + 'transFatContent' => (isset($recipe['nutrition']['trans_fat']) && $recipe['nutrition']['trans_fat'] ? $recipe['nutrition']['trans_fat'] . ' ' . $_nutrition_facts['main']['fat']['subs']['trans_fat']['measurement'] : ''), 'unsaturatedFatContent' => $unsaturatedFatContent, ], 'recipeInstructions' => $directions, diff --git a/includes/class.cooked-settings.php b/includes/class.cooked-settings.php index 9d1250d..f6294b4 100644 --- a/includes/class.cooked-settings.php +++ b/includes/class.cooked-settings.php @@ -56,7 +56,11 @@ public static function init() { $list_id_counter = 0; $_cooked_settings = Cooked_Settings::get(); register_setting( 'cooked_settings_group', 'cooked_settings', ['sanitize_callback' => [__CLASS__, 'sanitize_settings']] ); - register_setting( 'cooked_settings_group', 'cooked_settings_saved' ); + register_setting( 'cooked_settings_group', 'cooked_settings_saved', ['sanitize_callback' => [__CLASS__, 'sanitize_saved_flag']] ); + } + + public static function sanitize_saved_flag( $value ) { + return rest_sanitize_boolean( $value ); } // Add this new method to handle settings sanitization. @@ -103,7 +107,12 @@ public static function sanitize_settings($settings) { } function cooked_settings_saved_admin_notice() { - if (isset($_GET['settings-updated']) && $_GET['settings-updated'] && isset($_GET['page']) && $_GET['page'] === 'cooked_settings') { + // phpcs:disable WordPress.Security.NonceVerification.Recommended -- Display-only Settings API query vars. + $page = isset( $_GET['page'] ) ? sanitize_key( wp_unslash( $_GET['page'] ) ) : ''; + $settings_updated = isset( $_GET['settings-updated'] ) ? rest_sanitize_boolean( wp_unslash( $_GET['settings-updated'] ) ) : false; + // phpcs:enable WordPress.Security.NonceVerification.Recommended + + if ( $settings_updated && $page === 'cooked_settings' ) { add_settings_error( 'cooked_settings_group', 'cooked_settings_updated', @@ -115,7 +124,9 @@ function cooked_settings_saved_admin_notice() { function browse_page_missing_notice() { // Only show on admin pages, not on the Cooked settings page itself - if ( isset($_GET['page']) && $_GET['page'] === 'cooked_settings' ) { + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Display-only admin page query var. + $page = isset( $_GET['page'] ) ? sanitize_key( wp_unslash( $_GET['page'] ) ) : ''; + if ( $page === 'cooked_settings' ) { return; } @@ -127,10 +138,11 @@ function browse_page_missing_notice() { $class = 'notice notice-warning is-dismissible'; $message = sprintf( '' . __( 'Cooked Plugin Setup', 'cooked' ) . ' ' . + /* translators: %s: Browse/Search Recipes Page link */ __( 'To display your recipes properly, please set up your %s.', 'cooked' ), - '' . __( 'Browse/Search Recipes Page', 'cooked' ) . '' + '' . __( 'Browse/Search Recipes Page', 'cooked' ) . '' ); - printf( '

%2$s

', esc_attr( $class ), $message ); + printf( '

%2$s

', esc_attr( $class ), wp_kses_post( $message ) ); } } @@ -232,7 +244,7 @@ public static function prefix_dark_mode_css( $selectors ) { } if ( '' === $scope ) { - return $selectors; + return wp_kses( $selectors, [] ); } $parts = array_map( 'trim', explode( ',', $selectors ) ); @@ -243,15 +255,15 @@ function ( $part ) use ( $scope ) { $parts ); - return implode( ', ', $parts ); + return wp_kses( implode( ', ', $parts ), [] ); } public static function tabs_fields() { $pages_array = self::pages_array( __('Choose a page...','cooked'), __('No pages','cooked') ); $categories_array = self::terms_array( 'cp_recipe_category', __('No default', 'cooked'), __('No categories', 'cooked') ); $recipes_per_page_array = self::per_page_array(); - $recipe_archive_slug = sanitize_title_with_dashes( __( 'Recipe Archive', 'cooked' ) ); - $recipe_archive_url = home_url( '/' . $recipe_archive_slug . '/' ); + $recipe_archive_slug = sanitize_title_with_dashes( __( 'Recipe Archive', 'cooked' ) ); + $recipe_archive_url = home_url( '/' . $recipe_archive_slug . '/' ); // Dynamically load roles. $role_options = []; @@ -284,7 +296,7 @@ public static function tabs_fields() { 'recipes_per_page' => [ 'title' => __('Recipes Per Page', 'cooked'), /* translators: a description on how to choose the default number of recipes per page. */ - 'desc' => sprintf(__('Choose the default (set via the %s panel) or choose a different number here.', 'cooked'), '' . __('Settings > Reading', 'cooked') . ''), + 'desc' => sprintf(__('Choose the default (set via the %s panel) or choose a different number here.', 'cooked'), '' . __('Settings > Reading', 'cooked') . ''), 'type' => 'select', 'default' => 9, 'options' => $recipes_per_page_array @@ -335,7 +347,7 @@ public static function tabs_fields() { ], 'print_view_display_options' => [ 'title' => __('Print View', 'cooked'), - 'desc' => __('When enabled, the website logo will appear at the top of the recipe print screen.', 'cooked'), + 'desc' => esc_html__('When enabled, the website logo will appear at the top of the recipe print screen.', 'cooked'), 'type' => 'checkboxes', 'default' => [], 'options' => apply_filters( @@ -672,8 +684,8 @@ public static function field_radio( $field_name, $options ) { $combined_extras = $is_disabled . $conditional_value; - if ( $conditional_requirement ): echo ''; endif; - echo ''; + if ( $conditional_requirement ): echo ''; endif; + echo ''; echo ' '; echo '
'; if ( $conditional_requirement ): echo '
'; endif; @@ -693,7 +705,7 @@ public static function field_select( $field_name, $options, $color = false, $fie } echo '

'; - echo ''; + echo ''; foreach ( $options as $value => $name) { echo ''; } @@ -721,12 +733,12 @@ public static function field_migrate_button( $field_name, $title ) { if ($total > 0) { echo '

'; - echo ''; + echo ''; echo '

'; echo '

'; echo '0 / ' . esc_html( $total ) . ''; echo '

'; - echo '

Migration Complete! You can now ' . __( 'reload', 'cooked' ) . ' the settings screen.

'; + echo '

Migration Complete! You can now ' . esc_html__( 'reload', 'cooked' ) . ' the settings screen.

'; } } } @@ -770,7 +782,7 @@ public static function field_permalink_field($field_name, $end_of_url) { } echo ''; } @@ -799,7 +811,7 @@ public static function field_image_field( $field_name, $default ) { echo '
'; echo ''; - echo ''; + echo ''; if ( $has_image ) { echo wp_get_attachment_image( $attachment_id, 'thumbnail', false, [ @@ -865,11 +877,11 @@ public static function field_checkboxes($field_name, $options, $color = false, $ if ($is_disabled) { echo ''; - echo ''; } else { - echo ''; diff --git a/includes/class.cooked-shortcodes.php b/includes/class.cooked-shortcodes.php index e55aba0..42d9259 100644 --- a/includes/class.cooked-shortcodes.php +++ b/includes/class.cooked-shortcodes.php @@ -140,9 +140,10 @@ public function cooked_timer( $atts, $content = null ) { ); $desc = esc_attr($atts['desc']); - $seconds = $atts['seconds']; - $minutes = $atts['minutes'] ? $atts['minutes'] * 60 : $atts['length'] * 60; - $hours = $atts['hours'] * 60 * 60; + $seconds = floatval( $atts['seconds'] ); + $minutes_value = floatval( $atts['minutes'] ); + $minutes = $minutes_value ? $minutes_value * 60 : floatval( $atts['length'] ) * 60; + $hours = floatval( $atts['hours'] ) * 60 * 60; $seconds = $seconds + $minutes + $hours; if (!$cooked_timer_identifier) { @@ -164,15 +165,17 @@ public function cooked_browse_shortcode( $sc_atts, $content = null ) { if ( isset($_cooked_settings['advanced']) && !empty($_cooked_settings['advanced']) && in_array( 'disable_public_recipes', $_cooked_settings['advanced'] ) ) { /* translators: referring to the bottom of the Settings page. */ - return current_user_can( 'edit_cooked_settings' ) ? wpautop( sprintf( __('Public recipes are currently disabled. You can change this at the bottom of the %s page.','cooked'), '' . __( 'Settings', 'cooked' ) . '' ) ) : false; + return current_user_can( 'edit_cooked_settings' ) ? wpautop( sprintf( __('Public recipes are currently disabled. You can change this at the bottom of the %s page.','cooked'), '' . __( 'Settings', 'cooked' ) . '' ) ) : false; } if ( is_admin() ) return false; $author_query_var = sanitize_key( get_query_var( 'recipe_author', false ) ); - if ( !$author_query_var && isset( $_GET['recipe_author'] ) ) { - $author_query_var = sanitize_key( $_GET['recipe_author'] ); + // phpcs:disable WordPress.Security.NonceVerification.Recommended -- Display-only browse author filter. + if ( ! $author_query_var && isset( $_GET['recipe_author'] ) ) { + $author_query_var = sanitize_key( wp_unslash( $_GET['recipe_author'] ) ); } + // phpcs:enable WordPress.Security.NonceVerification.Recommended // Shortcode Attributes $atts = shortcode_atts( apply_filters( 'cooked_browse_shortcode_default_attributes', [ @@ -226,9 +229,9 @@ public function cooked_recipe_card_shortcode( $atts, $content = null ) { ob_start(); if ( $recipe_id ) { - echo Cooked_Recipes::card( $recipe_id, $width, $hide_image, $hide_title, $hide_excerpt, $hide_author, $style ); + echo wp_kses_post( Cooked_Recipes::card( $recipe_id, $width, $hide_image, $hide_title, $hide_excerpt, $hide_author, $style ) ); } elseif ( $category_id ) { - echo Cooked_Taxonomies::card( $category_id, $width, $hide_image, $hide_total, $style ); + echo wp_kses_post( Cooked_Taxonomies::card( $category_id, $width, $hide_image, $hide_total, $style ) ); } return ob_get_clean(); @@ -356,6 +359,7 @@ public function cooked_recipe_shortcode( $atts, $content = null ) { private static function recipe_embed_blocked_message( $recipe_id ) { $shortcode = '[cooked-recipe id="' . intval( $recipe_id ) . '"]'; $message = '' . sprintf( + /* translators: %s: recipe embed shortcode */ __( 'This recipe could not be displayed because it is set up to include itself (containing shortcode %s). Remove the duplicate recipe embed from the Recipe Template.', 'cooked' ), $shortcode ) . ''; @@ -681,7 +685,7 @@ public static function cooked_info_author() { echo ''; echo !$hide_avatars ? '' . ( !empty($author) ? wp_kses_post( $author['profile_photo'] ) : '' ) . '' : ''; - echo '' . __('Author', 'cooked') . '' . ( $clickable && $permalink ? '' : '' ) . (!empty($author) ? $author['name'] : '') . ( $clickable && $permalink ? '' : '' ); + echo '' . esc_html__('Author', 'cooked') . '' . ( $clickable && $permalink ? '' : '' ) . (!empty($author) ? esc_html( $author['name'] ) : '') . ( $clickable && $permalink ? '' : '' ); echo ''; wp_reset_postdata(); @@ -692,8 +696,8 @@ public static function cooked_info_difficulty( $recipe ) { global $_cooked_settings; if (in_array('difficulty_level', $_cooked_settings['recipe_info_display_options']) && isset($recipe['difficulty_level']) && $recipe['difficulty_level']) { - $dl_html = '' . __('Difficulty','cooked') . '' . Cooked_Recipes::difficulty_level( $recipe['difficulty_level'] ) . ''; - echo apply_filters( 'cooked_show_difficulty_level', $dl_html, $recipe['difficulty_level'] ); + $dl_html = '' . esc_html__('Difficulty','cooked') . '' . Cooked_Recipes::difficulty_level( $recipe['difficulty_level'] ) . ''; + echo wp_kses_post( apply_filters( 'cooked_show_difficulty_level', $dl_html, $recipe['difficulty_level'] ) ); } } @@ -714,13 +718,13 @@ public static function cooked_info_print() { $query_args['print'] = 1; $servings = (float)esc_html( get_query_var( 'servings', false ) ); $query_args['servings'] = !empty($servings) ? $servings : false; - echo ''; + echo ''; } public static function cooked_info_fullscreen() { global $recipe_settings, $_cooked_settings; - echo ''; + echo ''; wp_enqueue_script('cooked-nosleep'); } @@ -729,7 +733,7 @@ public static function cooked_info_prep_time( $recipe ) { if (!empty($_cooked_settings['recipe_info_display_options']) && in_array('timing_prep',$_cooked_settings['recipe_info_display_options'])) { $prep_time = isset($recipe['prep_time']) ? esc_html( $recipe['prep_time'] ) : 0; - echo $prep_time ? '' . __('Prep Time','cooked') . '' . Cooked_Measurements::time_format( $prep_time ) . '' : ''; + echo $prep_time ? '' . esc_html__('Prep Time','cooked') . '' . wp_kses_post( Cooked_Measurements::time_format( $prep_time ) ) . '' : ''; } } @@ -738,7 +742,7 @@ public static function cooked_info_cook_time( $recipe ) { if (!empty($_cooked_settings['recipe_info_display_options']) && in_array('timing_cook', $_cooked_settings['recipe_info_display_options'])) { $cook_time = isset($recipe['cook_time']) ? esc_html( $recipe['cook_time'] ) : 0; - echo $cook_time ? '' . __('Cook Time','cooked') . '' . Cooked_Measurements::time_format( $cook_time ) . '' : ''; + echo $cook_time ? '' . esc_html__('Cook Time','cooked') . '' . wp_kses_post( Cooked_Measurements::time_format( $cook_time ) ) . '' : ''; } } @@ -749,14 +753,14 @@ public static function cooked_info_total_time( $recipe ) { $total_time = isset($recipe['total_time']) ? esc_html( $recipe['total_time'] ) : 0; if ( $total_time ) { - echo $total_time ? '' . __('Total Time','cooked') . '' . Cooked_Measurements::time_format( $total_time ) . '' : ''; + echo $total_time ? '' . esc_html__('Total Time','cooked') . '' . wp_kses_post( Cooked_Measurements::time_format( $total_time ) ) . '' : ''; } else { $prep_time = isset($recipe['prep_time']) ? esc_html( $recipe['prep_time'] ) : 0; $cook_time = isset($recipe['cook_time']) ? esc_html( $recipe['cook_time'] ) : 0; if ( $prep_time && $cook_time ) { $total_time = $prep_time + $cook_time; - echo $total_time ? '' . __('Total Time','cooked') . '' . Cooked_Measurements::time_format( $total_time ) . '' : ''; + echo $total_time ? '' . esc_html__('Total Time','cooked') . '' . wp_kses_post( Cooked_Measurements::time_format( $total_time ) ) . '' : ''; } } } @@ -796,7 +800,7 @@ public static function cooked_info_taxonomies() { do_action( 'cooked_info_taxonomies_shortcode_after', $recipe_settings ); if ( $recipe_terms_list ): - echo wp_filter_post_kses( $recipe_terms_list ); + echo wp_kses_post( $recipe_terms_list ); endif; endif; @@ -833,10 +837,10 @@ public function cooked_notes_shortcode($atts, $content = null) { if (isset($recipe_settings['notes']) && !empty($recipe_settings['notes'])) { $notes = Cooked_Recipes::format_content($recipe_settings['notes']); - $show_header = $show_header ? '
' . __('Notes', 'cooked') . '
' : ''; + $show_header = $show_header ? '
' . esc_html__( 'Notes', 'cooked' ) . '
' : ''; echo '
'; - echo $show_header; + echo wp_kses_post( $show_header ); echo do_shortcode($notes); echo '
'; } @@ -975,7 +979,7 @@ public function cooked_nutrition_shortcode($atts, $content = null) { echo '

' . esc_html( isset($nutrition_facts[$slug]) ? $nutrition_facts[$slug] : '' ) . '

'; echo '
'; else: - echo '

' . $servings_change . ' ' . esc_html(strtolower($nf['name'])) . '

'; + echo '

' . esc_html( $servings_change ) . ' ' . esc_html(strtolower($nf['name'])) . '

'; endif; endforeach; echo '
'; @@ -1017,8 +1021,8 @@ public function cooked_nutrition_shortcode($atts, $content = null) { if ( isset( $nutrition_facts[$slug] ) && $nutrition_facts[$slug] || isset( $nutrition_facts[$slug] ) && $nutrition_facts[$slug] === '0' ): echo '
'; - echo '' . $nf['name'] . ' ' . esc_html( $nutrition_facts[$slug] ) . '' . ( isset($nf['measurement']) ? '' . esc_html__( $nf['measurement'], 'cooked' ) . '' : '' ); - echo ( isset( $nf['pdv'] ) && $nutrition_facts[$slug] ? '' . ceil( ( esc_html( $nutrition_facts[$slug] ) / $nf['pdv'] ) * 100 ) . '%' : '' ); + echo '' . esc_html( $nf['name'] ) . ' ' . esc_html( $nutrition_facts[$slug] ) . '' . ( isset($nf['measurement']) ? '' . esc_html( $nf['measurement'] ) . '' : '' ); + echo ( isset( $nf['pdv'] ) && $nutrition_facts[$slug] ? '' . esc_html( ceil( ( $nutrition_facts[$slug] / $nf['pdv'] ) * 100 ) ) . '%' : '' ); if ( isset($nf['subs']) ): foreach( $nf['subs'] as $sub_slug => $sub_nf ): @@ -1026,17 +1030,17 @@ public function cooked_nutrition_shortcode($atts, $content = null) { echo '
'; if ($sub_slug === 'trans_fat'): echo '
'; - echo $sub_nf['nutrition_info_name'] . ' ' . esc_html( $nutrition_facts[$sub_slug] ) . '' . ( isset($sub_nf['measurement']) ? '' . esc_html__( $sub_nf['measurement'], 'cooked' ) . '' : '' ); + echo wp_kses_post( $sub_nf['nutrition_info_name'] ) . ' ' . esc_html( $nutrition_facts[$sub_slug] ) . '' . ( isset($sub_nf['measurement']) ? '' . esc_html( $sub_nf['measurement'] ) . '' : '' ); echo '
'; elseif ($sub_slug === 'added_sugars'): echo '
'; - echo __('Includes', 'cooked') . ' ' . esc_html( $nutrition_facts[$sub_slug] ) . '' . ( isset($sub_nf['measurement']) ? '' . esc_html__( $sub_nf['measurement'], 'cooked' ) . '' : '' ) . ' ' . esc_html($sub_nf['name']); - echo ( isset( $sub_nf['pdv'] ) ? '' . ceil( ( esc_html( $nutrition_facts[$sub_slug] ) / $sub_nf['pdv'] ) * 100 ) . '%' : '' ); + echo esc_html__('Includes', 'cooked') . ' ' . esc_html( $nutrition_facts[$sub_slug] ) . '' . ( isset($sub_nf['measurement']) ? '' . esc_html( $sub_nf['measurement'] ) . '' : '' ) . ' ' . esc_html($sub_nf['name']); + echo ( isset( $sub_nf['pdv'] ) ? '' . esc_html( ceil( ( $nutrition_facts[$sub_slug] / $sub_nf['pdv'] ) * 100 ) ) . '%' : '' ); echo '
'; else: echo '
'; - echo esc_html( $sub_nf['name'] ) . ' ' . esc_html( $nutrition_facts[$sub_slug] ) . '' . ( isset($sub_nf['measurement']) ? '' . esc_html__( $sub_nf['measurement'], 'cooked' ) . '' : '' ); - echo ( isset( $sub_nf['pdv'] ) && $nutrition_facts[$sub_slug] ? '' . ceil( ( esc_html( $nutrition_facts[$sub_slug] ) / $sub_nf['pdv'] ) * 100 ) . '%' : '' ); + echo esc_html( $sub_nf['name'] ) . ' ' . esc_html( $nutrition_facts[$sub_slug] ) . '' . ( isset($sub_nf['measurement']) ? '' . esc_html( $sub_nf['measurement'] ) . '' : '' ); + echo ( isset( $sub_nf['pdv'] ) && $nutrition_facts[$sub_slug] ? '' . esc_html( ceil( ( $nutrition_facts[$sub_slug] / $sub_nf['pdv'] ) * 100 ) ) . '%' : '' ); echo '
'; endif; echo '
'; @@ -1065,8 +1069,8 @@ public function cooked_nutrition_shortcode($atts, $content = null) { foreach ( $bottom_facts as $slug => $nf ): if ( isset( $nutrition_facts[$slug] ) && $nutrition_facts[$slug] || isset( $nutrition_facts[$slug] ) && $nutrition_facts[$slug] === '0' ): echo '
'; - echo '' . esc_html($nf['name']) . ' ' . esc_html( $nutrition_facts[$slug] ) . '' . ( isset($nf['measurement']) ? '' . esc_html__( $nf['measurement'], 'cooked' ) . '' : '' ); - echo ( isset( $nf['pdv'] ) ? '' . ceil( ( esc_html( $nutrition_facts[$slug] ) / $nf['pdv'] ) * 100 ) . '%' : '' ); + echo '' . esc_html($nf['name']) . ' ' . esc_html( $nutrition_facts[$slug] ) . '' . ( isset($nf['measurement']) ? '' . esc_html( $nf['measurement'] ) . '' : '' ); + echo ( isset( $nf['pdv'] ) ? '' . esc_html( ceil( ( $nutrition_facts[$slug] / $nf['pdv'] ) * 100 ) ) . '%' : '' ); echo '
'; endif; endforeach; @@ -1088,7 +1092,7 @@ public function cooked_nutrition_shortcode($atts, $content = null) { echo '
'; echo '
'; - echo '
' . __('Amount per serving','cooked') . '
'; + echo '
' . esc_html__('Amount per serving','cooked') . '
'; if ( isset($mid_facts_content) && $mid_facts_content ): echo '
'; @@ -1098,7 +1102,7 @@ public function cooked_nutrition_shortcode($atts, $content = null) { if ( isset($main_facts_content) && $main_facts_content ): echo '
'; - echo '
' . __('% Daily Value *','cooked'). '
'; + echo '
' . esc_html__('% Daily Value *','cooked'). '
'; echo '
'; echo wp_kses_post( $main_facts_content ); echo '
'; @@ -1120,11 +1124,11 @@ public function cooked_nutrition_shortcode($atts, $content = null) { if ( isset($nutrition_facts_content) && $nutrition_facts_content ): echo '
'; - echo '
' . __('Nutrition Facts', 'cooked') . '
'; + echo '
' . esc_html__('Nutrition Facts', 'cooked') . '
'; echo wp_kses_post( $nutrition_facts_content ); if ( isset($main_facts_content) && $main_facts_content || isset($bottom_facts_content) && $bottom_facts_content ): echo '
'; - echo '

* ' . __('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.','cooked') . '

'; + echo '

* ' . esc_html__('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.','cooked') . '

'; endif; // Add the Edamam attribution "Powered by Edamam" if the Edamam API is enabled. @@ -1193,8 +1197,10 @@ public function cooked_related_recipes_shortcode($atts, $content = null) { // Check if it's a different post type $post_check = get_post($recipe_id); if ($post_check && $post_check->post_type !== 'cp_recipe') { + /* translators: %d: post ID */ $error_msg .= ' ' . sprintf(__('The specified ID (%d) is not a recipe.', 'cooked'), $recipe_id); } elseif (!$post_check) { + /* translators: %d: post ID */ $error_msg .= ' ' . sprintf(__('No post found with ID %d.', 'cooked'), $recipe_id); } return ''; @@ -1247,7 +1253,7 @@ public function cooked_related_recipes_shortcode($atts, $content = null) { foreach ($recipe_ids as $rid) { echo '
'; - echo Cooked_Recipes::card($rid, false, $hide_image, false, $hide_excerpt, $hide_author); + echo wp_kses_post( Cooked_Recipes::card($rid, false, $hide_image, false, $hide_excerpt, $hide_author) ); echo '
'; } diff --git a/includes/class.cooked-updates.php b/includes/class.cooked-updates.php index 5bd9ae4..6dcad4c 100644 --- a/includes/class.cooked-updates.php +++ b/includes/class.cooked-updates.php @@ -45,12 +45,20 @@ class Cooked_Updates { */ private static $cooked_settings_saved; + /** + * Whether rewrite rules were already flushed this request. + * + * @var bool + */ + private static $rewrite_rules_flushed = false; + /** * Initialize the updates system */ public function __construct() { // Add action to check version and update settings at the end of page load. add_action( 'shutdown', [__CLASS__, 'init'] ); + add_action( 'init', [ __CLASS__, 'maybe_heal_rewrite_rules' ], 99 ); } /** @@ -78,6 +86,8 @@ public static function init() { if ( self::needs_update() ) { self::run_updates(); } + + self::maybe_flush_queued_rewrite_rules(); } /** @@ -108,14 +118,18 @@ private static function run_updates() { // Run version-specific updates self::run_version_updates(); + self::update_rewrite_rules(); + // Update both version numbers. update_option( 'cooked_settings_version', self::$current_version ); if ( defined('COOKED_PRO_VERSION') ) { update_option( 'cooked_pro_settings_version', self::$current_pro_version ); } - // Log the update - error_log( sprintf( 'Cooked: Updated from version %s to %s', $old_version, self::$current_version ) ); + if ( defined( 'WP_DEBUG' ) && WP_DEBUG ) { + // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log + error_log( sprintf( 'Cooked: Updated from version %s to %s', $old_version, self::$current_version ) ); + } } /** @@ -131,7 +145,10 @@ private static function run_version_updates() { try { call_user_func( [__CLASS__, $method] ); } catch ( Exception $e ) { - error_log( sprintf( 'Cooked: Error running update method %s: %s', $method, $e->getMessage() ) ); + if ( defined( 'WP_DEBUG' ) && WP_DEBUG ) { + // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log + error_log( sprintf( 'Cooked: Error running update method %s: %s', $method, $e->getMessage() ) ); + } } } } @@ -204,9 +221,11 @@ public static function run_tool( $tool_name ) { } } if ( ! isset( $allowed[ $tool_name ] ) ) { + /* translators: %s: site health tool name */ return new \WP_Error( 'cooked_tool_invalid', sprintf( __( 'Unknown tool: %s.', 'cooked' ), $tool_name ) ); } if ( ! method_exists( __CLASS__, $tool_name ) ) { + /* translators: %s: PHP method name */ return new \WP_Error( 'cooked_tool_missing', sprintf( __( 'Tool method %s does not exist.', 'cooked' ), $tool_name ) ); } @@ -327,7 +346,8 @@ private static function fix_recipe_line_endings() { } // Log the update if any recipes were modified - if ( $updated_count > 0 ) { + if ( $updated_count > 0 && defined( 'WP_DEBUG' ) && WP_DEBUG ) { + // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log error_log( sprintf( 'Cooked: Fixed line endings in %d recipes for WordPress exporter/importer compatibility.', $updated_count ) ); } } @@ -345,7 +365,10 @@ private static function purge_legacy_related_recipes_cache() { delete_option( 'cooked_related_version' ); delete_option( 'cooked_related_calculation_last' ); - error_log( 'Cooked: Purged legacy related-recipes cache and options.' ); + if ( defined( 'WP_DEBUG' ) && WP_DEBUG ) { + // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log + error_log( 'Cooked: Purged legacy related-recipes cache and options.' ); + } } /** @@ -378,19 +401,146 @@ private static function remove_recipes_from_cooked_user_meta() { $updated_count++; } - if ( $updated_count > 0 ) { + if ( $updated_count > 0 && defined( 'WP_DEBUG' ) && WP_DEBUG ) { + // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log error_log( sprintf( 'Cooked: Removed legacy recipes key from %d user(s) cooked_user_meta.', $updated_count ) ); } } + /** + * Soft-flush rewrite rules when any rule registered this request is missing + * from the stored rewrite_rules option. + * + * @since 1.16.0 + * @return void + */ + public static function maybe_heal_rewrite_rules() { + if ( self::registered_rewrite_rules_missing() ) { + self::update_rewrite_rules(); + } + } + + /** + * Queue a one-shot rewrite flush when registered rewrite rules are missing + * from the stored rewrite_rules option. + * + * @since 1.16.0 + * @return void + */ + public static function maybe_queue_rewrite_flush() { + if ( self::registered_rewrite_rules_missing() ) { + update_option( 'cooked_flush_rewrite_rules', '1' ); + } + } + + /** + * Whether the stored rewrite_rules option is missing any rewrite rule + * registered this request via add_rewrite_rule(). + * + * @since 1.16.0 + * @return bool + */ + public static function registered_rewrite_rules_missing() { + if ( function_exists( 'wp_installing' ) && wp_installing() ) { + return false; + } + + if ( ! get_option( 'permalink_structure' ) ) { + return false; + } + + $registered = self::registered_extra_rewrite_rules(); + if ( empty( $registered ) ) { + return false; + } + + $stored = get_option( 'rewrite_rules' ); + if ( ! is_array( $stored ) || empty( $stored ) ) { + return true; + } + + foreach ( $registered as $regex => $query ) { + if ( array_key_exists( $regex, $stored ) ) { + continue; + } + + if ( is_string( $query ) && in_array( $query, $stored, true ) ) { + continue; + } + + return true; + } + + return false; + } + + /** + * Rewrite rules added this request with add_rewrite_rule(). + * + * @since 1.16.0 + * @return array + */ + private static function registered_extra_rewrite_rules() { + global $wp_rewrite; + + if ( ! is_object( $wp_rewrite ) ) { + return []; + } + + $rules = []; + + if ( ! empty( $wp_rewrite->extra_rules_top ) && is_array( $wp_rewrite->extra_rules_top ) ) { + $rules = $wp_rewrite->extra_rules_top; + } + + if ( ! empty( $wp_rewrite->extra_rules ) && is_array( $wp_rewrite->extra_rules ) ) { + $rules = array_merge( $rules, $wp_rewrite->extra_rules ); + } + + return $rules; + } + + /** + * Soft-flush rewrite rules when a previous request queued it. + * + * @since 1.16.0 + * @return void + */ + public static function maybe_flush_queued_rewrite_rules() { + if ( ! get_option( 'cooked_flush_rewrite_rules' ) ) { + return; + } + + self::update_rewrite_rules(); + delete_option( 'cooked_flush_rewrite_rules' ); + } + + /** + * Reset per-request flush state. Used by tests. + * + * @since 1.16.0 + * @return void + */ + public static function reset_rewrite_flush_state() { + self::$rewrite_rules_flushed = false; + } + /** * Update rewrite rules if needed * * @since 1.11.2 */ private static function update_rewrite_rules() { - flush_rewrite_rules(); - error_log( 'Cooked: Flushed rewrite rules due to version update.' ); + if ( self::$rewrite_rules_flushed ) { + return; + } + + flush_rewrite_rules( false ); + self::$rewrite_rules_flushed = true; + if ( defined( 'WP_DEBUG' ) && WP_DEBUG ) { + // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log + error_log( 'Cooked: Flushed rewrite rules due to version update.' ); + } } } diff --git a/includes/class.cooked-widgets.php b/includes/class.cooked-widgets.php index d4896f3..9d6c8b2 100644 --- a/includes/class.cooked-widgets.php +++ b/includes/class.cooked-widgets.php @@ -37,7 +37,7 @@ public function register_widgets() { public static function recipe_finder( $field_id = '', $field_name = '', $included = '' ) { $button_title = ( ! empty( $included ) ? __( 'Edit Recipe(s)...', 'cooked' ) : __( 'Choose recipe(s)...', 'cooked' ) ); echo ''; - echo ''; if ( ! empty( $included ) ) : foreach ( $included as $recipe ) : $recipe_status = get_post_status( $recipe ); diff --git a/includes/widgets/init.php b/includes/widgets/init.php index 90cec5c..1e6ec21 100644 --- a/includes/widgets/init.php +++ b/includes/widgets/init.php @@ -1,4 +1,8 @@ backup your database in case something goes wrong." msgstr "Avant de commencer, assurez-vous de sauvegarder votre base de données au cas où quelque chose se passerait mal." -#: includes/class.cooked-import.php:50 -#: includes/class.cooked-import.php:104 +#: includes/class.cooked-import.php:54 +#: includes/class.cooked-import.php:108 msgid "Click the button below to import these recipes. Here is what will happen to your recipes:" msgstr "Cliquez sur le bouton ci-dessous pour importer ces recettes. Voici ce qui va se passer :" -#: includes/class.cooked-import.php:52 -#: includes/class.cooked-import.php:106 +#: includes/class.cooked-import.php:56 +#: includes/class.cooked-import.php:110 msgid "Recipes will be imported with the 'Draft' status." msgstr "Les recettes seront importées avec le statut « Brouillon »." -#: includes/class.cooked-import.php:53 -#: includes/class.cooked-import.php:107 +#: includes/class.cooked-import.php:57 +#: includes/class.cooked-import.php:111 msgid "Comments and ratings data will also be imported (ratings are available in Cooked Pro)." msgstr "Les commentaires et les notes seront également importés (les notes sont disponibles dans Cooked Pro)." -#: includes/class.cooked-import.php:54 -#: includes/class.cooked-import.php:109 +#: includes/class.cooked-import.php:58 +#: includes/class.cooked-import.php:113 msgid "After the import is complete, you can bulk edit the recipes and change their status to 'Published'." msgstr "Une fois l'importation terminée, vous pouvez modifier les recettes en masse et changer leur statut en « Publié »." -#: includes/class.cooked-import.php:55 +#: includes/class.cooked-import.php:59 msgid "The existing WP Delicious recipes and data will not be modified or deleted." msgstr "Les recettes et données WP Delicious existantes ne seront ni modifiées ni supprimées." -#: includes/class.cooked-import.php:56 -#: includes/class.cooked-import.php:111 +#: includes/class.cooked-import.php:60 +#: includes/class.cooked-import.php:115 msgid "Certain data that is not suppoted by Cooked will not be imported (such as Cooking Temp, Estimated Cost, Recipe Keywords, etc)." msgstr "Certaines données non prises en charge par Cooked ne seront pas importées (température de cuisson, coût estimé, mots-clés de recette, etc.)." -#: includes/class.cooked-import.php:57 -#: includes/class.cooked-import.php:112 +#: includes/class.cooked-import.php:61 +#: includes/class.cooked-import.php:116 msgid "You can run the import multiple times, but keep in mind that duplicate recipes will be created." msgstr "Vous pouvez lancer l'importation plusieurs fois, mais des recettes en double seront créées." -#: includes/class.cooked-import.php:61 -#: includes/class.cooked-import.php:116 +#: includes/class.cooked-import.php:65 +#: includes/class.cooked-import.php:120 #: includes/class.cooked-migration.php:58 msgid "Wow, you have a lot of recipes!" msgstr "Wow, vous avez beaucoup de recettes !" -#: includes/class.cooked-import.php:61 -#: includes/class.cooked-import.php:116 +#: includes/class.cooked-import.php:65 +#: includes/class.cooked-import.php:120 #: includes/class.cooked-migration.php:58 msgid "It is definitely recommended that you get yourself a cup of coffee or tea after clicking this button." msgstr "Il est fortement recommandé de prendre une tasse de café ou de thé après avoir cliqué sur ce bouton." -#: includes/class.cooked-import.php:63 -#: includes/class.cooked-import.php:118 -#: includes/class.cooked-import.php:170 +#: includes/class.cooked-import.php:67 +#: includes/class.cooked-import.php:122 +#: includes/class.cooked-import.php:174 #: includes/class.cooked-migration.php:60 msgid "Note:" msgstr "Remarque :" -#: includes/class.cooked-import.php:63 -#: includes/class.cooked-import.php:118 +#: includes/class.cooked-import.php:67 +#: includes/class.cooked-import.php:122 #: includes/class.cooked-migration.php:60 msgid "The more recipes you have, the longer this will take." msgstr "Plus vous avez de recettes, plus cela prendra de temps." -#: includes/class.cooked-import.php:68 -#: includes/class.cooked-import.php:83 +#: includes/class.cooked-import.php:72 +#: includes/class.cooked-import.php:87 msgid "WP Delicious - Import" msgstr "WP Delicious - Importation" -#: includes/class.cooked-import.php:108 +#: includes/class.cooked-import.php:112 msgid "The difficulty level will be set to Beginner since it is not supported by WP Recipe Maker." msgstr "Le niveau de difficulté sera défini sur Débutant, car il n'est pas pris en charge par WP Recipe Maker." -#: includes/class.cooked-import.php:110 +#: includes/class.cooked-import.php:114 msgid "The existing WP Recipe Maker and data will not be modified or deleted." msgstr "Les recettes et données WP Recipe Maker existantes ne seront ni modifiées ni supprimées." -#: includes/class.cooked-import.php:123 -#: includes/class.cooked-import.php:138 +#: includes/class.cooked-import.php:127 +#: includes/class.cooked-import.php:142 msgid "WP Recipe Maker - Import" msgstr "WP Recipe Maker - Importation" -#: includes/class.cooked-import.php:152 +#: includes/class.cooked-import.php:156 msgid "Import recipes from a CSV file. Your CSV file should include the following columns:" msgstr "Importez des recettes depuis un fichier CSV. Votre fichier CSV doit inclure les colonnes suivantes :" -#: includes/class.cooked-import.php:154 +#: includes/class.cooked-import.php:158 msgid "Recipe title (required)" msgstr "Titre de la recette (obligatoire)" -#: includes/class.cooked-import.php:156 +#: includes/class.cooked-import.php:160 msgid "Prep time in minutes" msgstr "Temps de préparation en minutes" -#: includes/class.cooked-import.php:157 +#: includes/class.cooked-import.php:161 msgid "Cook time in minutes" msgstr "Temps de cuisson en minutes" -#: includes/class.cooked-import.php:158 +#: includes/class.cooked-import.php:162 msgid "Difficulty level (1=Beginner, 2=Intermediate, 3=Advanced)" msgstr "Niveau de difficulté (1=Débutant, 2=Intermédiaire, 3=Avancé)" -#: includes/class.cooked-import.php:170 +#: includes/class.cooked-import.php:174 msgid "Recipes will be imported with the 'Draft' status. After the import is complete, you can bulk edit the recipes and change their status to 'Published'." msgstr "Les recettes seront importées avec le statut « Brouillon ». Une fois l'importation terminée, vous pouvez les modifier en masse et changer leur statut en « Publié »." -#: includes/class.cooked-import.php:173 +#: includes/class.cooked-import.php:177 msgid "CSV Import" msgstr "Importation CSV" -#: includes/class.cooked-import.php:177 +#: includes/class.cooked-import.php:181 msgid "Import Recipes via CSV" msgstr "Importer des recettes via CSV" -#: includes/class.cooked-import.php:185 +#: includes/class.cooked-import.php:189 msgid "More Imports are Coming Soon..." msgstr "D'autres importations arrivent bientôt..." -#: includes/class.cooked-import.php:206 +#: includes/class.cooked-import.php:210 msgid "Begin Import" msgstr "Commencer l'importation" -#: includes/class.cooked-import.php:211 -#: includes/class.cooked-import.php:234 -#: includes/class.cooked-settings.php:729 +#: includes/class.cooked-import.php:215 +#: includes/class.cooked-import.php:238 +#: includes/class.cooked-settings.php:741 msgid "reload" msgstr "recharger" -#: includes/class.cooked-import.php:229 +#: includes/class.cooked-import.php:233 msgid "Upload and Import CSV" msgstr "Téléverser et importer le CSV" -#: includes/class.cooked-import.php:234 +#: includes/class.cooked-import.php:238 msgid "Import Complete!" msgstr "Importation terminée !" -#: includes/class.cooked-import.php:234 +#: includes/class.cooked-import.php:238 msgid "You can now" msgstr "Vous pouvez maintenant" -#: includes/class.cooked-import.php:234 +#: includes/class.cooked-import.php:238 msgid "the import screen or" msgstr "l'écran d'importation ou" -#: includes/class.cooked-import.php:234 +#: includes/class.cooked-import.php:238 msgid "view your recipes" msgstr "voir vos recettes" @@ -744,8 +744,9 @@ msgid "Choose recipe(s)..." msgstr "Choisir recette(s)..." #. translators: singular and plural "steps" -#: includes/class.cooked-recipes.php:1202 -#: includes/class.cooked-seo.php:83 +#. translators: %d: step number +#: includes/class.cooked-recipes.php:1207 +#: includes/class.cooked-seo.php:84 #, php-format msgid "Step %d" msgstr "Étape %d" @@ -808,7 +809,7 @@ msgstr "Masquer l'extrait" msgid "Parent Category" msgstr "Catégorie parente" -#: includes/class.cooked-recipes.php:1285 +#: includes/class.cooked-recipes.php:1290 #: includes/class.cooked-taxonomies.php:41 #: includes/widgets/recipe-categories.php:63 msgid "All Categories" @@ -874,7 +875,7 @@ msgid "What's new in %s?" msgstr "Quoi de neuf dans %s ?" #: includes/class.cooked-functions.php:127 -#: includes/class.cooked-shortcodes.php:717 +#: includes/class.cooked-shortcodes.php:721 msgid "Print" msgstr "Imprimer" @@ -894,103 +895,105 @@ msgstr "Informations" msgid "Images" msgstr "Images" -#: includes/class.cooked-post-types.php:89 +#: includes/class.cooked-post-types.php:90 msgid "Photo" msgstr "Photo" -#: includes/class.cooked-post-types.php:433 -#: includes/class.cooked-settings.php:253 +#: includes/class.cooked-post-types.php:449 +#: includes/class.cooked-settings.php:265 msgid "Recipe Archive" msgstr "Archive des recettes" #: includes/class.cooked-admin-menus.php:36 #: includes/class.cooked-admin-menus.php:59 -#: includes/class.cooked-post-types.php:451 -#: includes/class.cooked-post-types.php:463 +#: includes/class.cooked-post-types.php:468 +#: includes/class.cooked-post-types.php:480 #: includes/class.cooked-users.php:166 msgid "Recipes" msgstr "Recettes" -#: includes/class.cooked-post-types.php:452 +#: includes/class.cooked-post-types.php:469 msgid "Recipe" msgstr "Recette" #: includes/class.cooked-admin-menus.php:37 #: includes/class.cooked-admin-menus.php:61 -#: includes/class.cooked-post-types.php:453 +#: includes/class.cooked-post-types.php:470 msgid "Add New" msgstr "Ajouter une recette" -#: includes/class.cooked-post-types.php:454 +#: includes/class.cooked-post-types.php:471 msgid "Add New Recipe" msgstr "Ajouter une nouvelle recette" -#: includes/class.cooked-post-types.php:455 +#: includes/class.cooked-post-types.php:472 msgid "New Recipe" msgstr "Nouvelle recette" -#: includes/class.cooked-post-types.php:456 +#: includes/class.cooked-post-types.php:473 msgid "Edit Recipe" msgstr "Modifier la recette" -#: includes/class.cooked-post-types.php:457 +#: includes/class.cooked-post-types.php:474 msgid "View Recipe" msgstr "Voir la recette" #: includes/class.cooked-admin-menus.php:60 -#: includes/class.cooked-post-types.php:458 +#: includes/class.cooked-post-types.php:475 msgid "All Recipes" msgstr "Toutes les recettes" -#: includes/class.cooked-post-types.php:459 +#: includes/class.cooked-post-types.php:476 msgid "Search Recipes" msgstr "Rechercher des recettes" -#: includes/class.cooked-post-types.php:460 +#: includes/class.cooked-post-types.php:477 msgid "No recipes found." msgstr "Aucune recette trouvée." -#: includes/class.cooked-post-types.php:461 +#: includes/class.cooked-post-types.php:478 msgid "No recipes found in trash." msgstr "Aucune recette trouvée dans la corbeille." -#: includes/class.cooked-post-types.php:489 +#: includes/class.cooked-post-types.php:506 msgid "Recipe title ..." msgstr "Titre de la recette..." -#: includes/class.cooked-post-types.php:520 +#: includes/class.cooked-post-types.php:537 msgid "Cooked Browse Recipes Page" msgstr "Page Parcourir les recettes Cooked" -#: includes/class.cooked-ajax.php:316 -#: includes/class.cooked-ajax.php:365 +#: includes/class.cooked-ajax.php:321 +#: includes/class.cooked-ajax.php:371 msgid "No default content provided." msgstr "Aucun contenu par défaut fourni." -#: includes/class.cooked-ajax.php:394 -#: includes/class.cooked-ajax.php:430 +#: includes/class.cooked-ajax.php:401 +#: includes/class.cooked-ajax.php:444 msgid "You do not have permission to import recipes." msgstr "Vous n'avez pas l'autorisation d'importer des recettes." #: includes/class.cooked-admin-enqueues.php:164 -#: includes/class.cooked-ajax.php:398 +#: includes/class.cooked-ajax.php:405 +#: includes/class.cooked-ajax.php:410 msgid "File upload failed." msgstr "Échec du téléversement du fichier." -#: includes/class.cooked-ajax.php:404 +#: includes/class.cooked-ajax.php:417 msgid "Invalid file type. Please upload a CSV file." msgstr "Type de fichier invalide. Veuillez téléverser un fichier CSV." -#: includes/class.cooked-ajax.php:437 +#: includes/class.cooked-ajax.php:451 msgid "CSV file not found. Please upload again." msgstr "Fichier CSV introuvable. Veuillez le téléverser à nouveau." -#: includes/class.cooked-ajax.php:453 +#. translators: %d: number of recipes imported +#: includes/class.cooked-ajax.php:468 #, php-format msgid "Successfully imported %d recipe(s)." msgstr "%d recette(s) importée(s) avec succès." -#: includes/class.cooked-ajax.php:462 +#: includes/class.cooked-ajax.php:477 msgid "No recipes were imported." msgstr "Aucune recette n'a été importée." @@ -998,8 +1001,8 @@ msgstr "Aucune recette n'a été importée." msgid "Recipe Category" msgstr "Catégorie de recette" -#: includes/class.cooked-recipes.php:1283 -#: includes/class.cooked-settings.php:300 +#: includes/class.cooked-recipes.php:1288 +#: includes/class.cooked-settings.php:312 #: includes/class.cooked-taxonomies.php:38 #: includes/class.cooked-taxonomies.php:48 msgid "Categories" @@ -1069,371 +1072,372 @@ msgstr "Passer à Pro" msgid "You do not have sufficient permissions to access this page." msgstr "Vous n'avez pas les autorisations suffisantes pour accéder à cette page." -#: includes/class.cooked-settings.php:110 +#: includes/class.cooked-settings.php:119 msgid "Cooked settings has been updated!" msgstr "Les réglages Cooked ont été mis à jour !" -#: includes/class.cooked-settings.php:129 +#: includes/class.cooked-settings.php:140 msgid "Cooked Plugin Setup" msgstr "Configuration du plugin Cooked" -#: includes/class.cooked-settings.php:130 +#. translators: %s: Browse/Search Recipes Page link +#: includes/class.cooked-settings.php:142 #, php-format msgid "To display your recipes properly, please set up your %s." msgstr "Pour afficher correctement vos recettes, veuillez configurer votre %s." -#: includes/class.cooked-settings.php:131 -#: includes/class.cooked-settings.php:277 +#: includes/class.cooked-settings.php:143 +#: includes/class.cooked-settings.php:289 msgid "Browse/Search Recipes Page" msgstr "Parcourir / Rechercher des pages de recettes" -#: includes/class.cooked-settings.php:250 +#: includes/class.cooked-settings.php:262 msgid "Choose a page..." msgstr "Choisir une page…" -#: includes/class.cooked-settings.php:250 +#: includes/class.cooked-settings.php:262 msgid "No pages" msgstr "Aucune page" -#: includes/class.cooked-settings.php:251 +#: includes/class.cooked-settings.php:263 msgid "No default" msgstr "Pas de choix par défaut" -#: includes/class.cooked-recipes.php:1280 -#: includes/class.cooked-settings.php:251 +#: includes/class.cooked-recipes.php:1285 +#: includes/class.cooked-settings.php:263 msgid "No categories" msgstr "Aucune catégories" -#: includes/class.cooked-settings.php:273 +#: includes/class.cooked-settings.php:285 msgid "General" msgstr "Général" #. translators: a description on how to add the [cooked-browse] shortcode to a page -#: includes/class.cooked-settings.php:279 +#: includes/class.cooked-settings.php:291 #, php-format msgid "Create a page with the %s shortcode on it, then choose it from this dropdown." msgstr "Créez une page avec le shortcode %s, puis sélectionnez-la dans la liste ci-dessous." #. translators: a description on how to add the [cooked-browse] shortcode to a page -#: includes/class.cooked-settings.php:279 +#: includes/class.cooked-settings.php:291 msgid "Note: This setting is required for the plugin to function properly." msgstr "Remarque : ce réglage est requis pour que le plugin fonctionne correctement." -#: includes/class.cooked-settings.php:285 +#: includes/class.cooked-settings.php:297 msgid "Recipes Per Page" msgstr "Nombre de recettes par page" #. translators: a description on how to choose the default number of recipes per page. -#: includes/class.cooked-settings.php:287 +#: includes/class.cooked-settings.php:299 #, php-format msgid "Choose the default (set via the %s panel) or choose a different number here." msgstr "Choisissez la valeur par défaut (définie via le panneau %s) ou indiquez une autre valeur ici." #. translators: a description on how to choose the default number of recipes per page. -#: includes/class.cooked-settings.php:287 +#: includes/class.cooked-settings.php:299 msgid "Settings > Reading" msgstr "Paramètres > Lecture" -#: includes/class.cooked-settings.php:293 +#: includes/class.cooked-settings.php:305 msgid "Recipe Taxonomies" msgstr "Taxonomies des recettes" -#: includes/class.cooked-settings.php:294 +#: includes/class.cooked-settings.php:306 msgid "Choose which taxonomies you want to enable for your recipes." msgstr "Choisissez les taxonomies que vous souhaitez activer pour vos recettes." -#: includes/class.cooked-settings.php:305 +#: includes/class.cooked-settings.php:317 msgid "Global Recipe Toggles" msgstr "Bascule de la totalité des recettes" -#: includes/class.cooked-settings.php:306 +#: includes/class.cooked-settings.php:318 msgid "You can quickly hide or show different recipe elements (site-wide) with these checkboxes." msgstr "Vous pouvez masquer ou afficher rapidement différents éléments de recette (sur l’ensemble du site) à l’aide de ces cases à cocher." -#: includes/class.cooked-measurements.php:217 -#: includes/class.cooked-recipes.php:1003 -#: includes/class.cooked-settings.php:332 +#: includes/class.cooked-measurements.php:221 +#: includes/class.cooked-recipes.php:1008 +#: includes/class.cooked-settings.php:344 msgid "Servings" msgstr "Parts" -#: includes/class.cooked-settings.php:349 +#: includes/class.cooked-settings.php:361 msgid "Carbs Format" msgstr "Format des glucides" -#: includes/class.cooked-settings.php:350 +#: includes/class.cooked-settings.php:362 msgid "You can display carbs as \"Total\" or \"Net\"." msgstr "Vous pouvez afficher les glucides comme « total » ou « net »." -#: includes/class.cooked-settings.php:356 +#: includes/class.cooked-settings.php:368 msgid "Total Carbs" msgstr "Glucides totaux" -#: includes/class.cooked-settings.php:357 +#: includes/class.cooked-settings.php:369 msgid "Net Carbs" msgstr "Glucides nets" -#: includes/class.cooked-settings.php:362 +#: includes/class.cooked-settings.php:374 msgid "Author Name Format" msgstr "Format du nom d'auteur" -#: includes/class.cooked-settings.php:363 +#: includes/class.cooked-settings.php:375 msgid "You can show the full author's name or just a part of it." msgstr "Vous pouvez afficher le nom complet de l’auteur ou seulement une partie de celui-ci." -#: includes/class.cooked-settings.php:369 +#: includes/class.cooked-settings.php:381 msgid "Full name" msgstr "Nom complet" -#: includes/class.cooked-settings.php:370 +#: includes/class.cooked-settings.php:382 msgid "Full first name w/last name initial" msgstr "Prénom complet / 1ère lettre du nom de famille" -#: includes/class.cooked-settings.php:371 +#: includes/class.cooked-settings.php:383 msgid "First name initial w/full last name" msgstr "1ère lettre du prénom / nom complet" -#: includes/class.cooked-settings.php:372 +#: includes/class.cooked-settings.php:384 msgid "First name only" msgstr "Prénom uniquement" -#: includes/class.cooked-settings.php:377 +#: includes/class.cooked-settings.php:389 msgid "Author Links" msgstr "Liens vers l'auteur" -#: includes/class.cooked-settings.php:378 +#: includes/class.cooked-settings.php:390 msgid "If you do not want the author names to link to the author recipe listings, you can disable them here." msgstr "Si vous ne souhaitez pas que les noms des auteurs soient reliés à leurs recettes, vous pouvez les désactiver ici." -#: includes/class.cooked-settings.php:378 +#: includes/class.cooked-settings.php:390 msgid "Note: Author links require the Browse/Search Recipes Page to be set up correctly to function properly." msgstr "Remarque : les liens d'auteur nécessitent une page Parcourir/Rechercher des recettes correctement configurée." -#: includes/class.cooked-settings.php:385 +#: includes/class.cooked-settings.php:397 msgid "Disable Author Links" msgstr "Désactiver les liens vers l’auteur" -#: includes/class.cooked-settings.php:390 +#: includes/class.cooked-settings.php:402 msgid "Default Category" msgstr "Catégorie par Défaut" #. translators: a description on how to set the default recipe category for the [cooked-browse] shortcode. -#: includes/class.cooked-settings.php:392 +#: includes/class.cooked-settings.php:404 #, php-format msgid "Optionally set the default recipe category for your %s shortcode display." msgstr "Si vous le voulez, vous pouvez indiquer une catégorie de recettes qui sera utilisée par défaut avec le shortcode %s." -#: includes/class.cooked-settings.php:398 +#: includes/class.cooked-settings.php:410 msgid "Default Sort Order" msgstr "Classement par défaut" #. translators: a description on how to set the default sort order for the [cooked-browse] shortcode. -#: includes/class.cooked-settings.php:400 +#: includes/class.cooked-settings.php:412 #, php-format msgid "Set the default sort order for your %s shortcode display." msgstr "Indiquez l'ordre de tri qui sera utilisé par défaut avec avec le shortcode %s." -#: includes/class.cooked-settings.php:406 +#: includes/class.cooked-settings.php:418 msgid "Newest First" msgstr "La plus récente en premier" -#: includes/class.cooked-settings.php:407 +#: includes/class.cooked-settings.php:419 msgid "Oldest First" msgstr "La plus ancienne en premier" -#: includes/class.cooked-settings.php:408 +#: includes/class.cooked-settings.php:420 msgid "Alphabetical" msgstr "Alphabétique" -#: includes/class.cooked-settings.php:409 +#: includes/class.cooked-settings.php:421 msgid "Alphabetical (reversed)" msgstr "Alphabétique (inversé)" -#: includes/class.cooked-settings.php:414 +#: includes/class.cooked-settings.php:426 msgid "Section Heading Default HTML Tag" msgstr "Balise HTML par défaut des titres de section" #. translators: a description on how to set the default sort order for the [cooked-browse] shortcode. -#: includes/class.cooked-settings.php:416 +#: includes/class.cooked-settings.php:428 msgid "Set the default HTML tag for your section headings." msgstr "Définissez la balise HTML par défaut pour vos titres de section." -#: includes/class.cooked-settings.php:422 +#: includes/class.cooked-settings.php:434 msgid "div" msgstr "div" -#: includes/class.cooked-settings.php:423 +#: includes/class.cooked-settings.php:435 msgid "h2" msgstr "h2" -#: includes/class.cooked-settings.php:424 +#: includes/class.cooked-settings.php:436 msgid "h3" msgstr "h3" -#: includes/class.cooked-settings.php:425 +#: includes/class.cooked-settings.php:437 msgid "h4" msgstr "h4" -#: includes/class.cooked-settings.php:426 +#: includes/class.cooked-settings.php:438 msgid "h5" msgstr "h5" -#: includes/class.cooked-settings.php:427 +#: includes/class.cooked-settings.php:439 msgid "h6" msgstr "h6" -#: includes/class.cooked-settings.php:432 +#: includes/class.cooked-settings.php:444 msgid "WP Editor Roles" msgstr "Rôles de l'éditeur WP" -#: includes/class.cooked-settings.php:433 +#: includes/class.cooked-settings.php:445 msgid "Choose which user roles can use the WP Editor for the Excerpt, Directions & Notes fields." msgstr "Choisissez quels rôles peuvent utiliser l'éditeur WP pour l'extrait, les instructions et les notes." -#: includes/class.cooked-settings.php:439 +#: includes/class.cooked-settings.php:451 msgid "Advanced Settings" msgstr "Paramètres Avancés" #. translators: an option to only show recipes with the [cooked-recipe] shortcode. -#: includes/class.cooked-settings.php:449 +#: includes/class.cooked-settings.php:461 msgid "Disable Public Recipes" msgstr "Désactiver les recettes publiques" #. translators: an option to only show recipes with the [cooked-recipe] shortcode. -#: includes/class.cooked-settings.php:449 +#: includes/class.cooked-settings.php:461 #, php-format msgid "Only show recipes using the %s shortcode." msgstr "Afficher uniquement les recettes en utilisant le shortcode %s." #. translators: an option to disable "meta" tags. -#: includes/class.cooked-settings.php:451 +#: includes/class.cooked-settings.php:463 #, php-format msgid "Disable %s Tags" msgstr "Désactiver les mots-clés %s" #. translators: an option to disable "meta" tags. -#: includes/class.cooked-settings.php:451 +#: includes/class.cooked-settings.php:463 msgid "Prevents duplicates when tags already exist." msgstr "Empêcher les doublons lorsque les mots-clés existent déjà." -#: includes/class.cooked-settings.php:452 +#: includes/class.cooked-settings.php:464 msgid "Disable \"Servings Switcher\"" msgstr "Désactiver le \"Sélecteur de parts\"" -#: includes/class.cooked-settings.php:452 +#: includes/class.cooked-settings.php:464 msgid "Removes the servings dropdown on recipes." msgstr "Supprimer la liste déroulante indiquant le nombre de parts sur les recettes." -#: includes/class.cooked-settings.php:454 +#: includes/class.cooked-settings.php:466 msgid "Disable Recipe Schema Output" msgstr "Désactiver la sortie de schéma de recette" -#: includes/class.cooked-settings.php:454 +#: includes/class.cooked-settings.php:466 msgid "You should only do this if you're using something else to output schema information." msgstr "Vous ne devriez le faire que si vous utilisez autre chose pour produire des informations sur les schémas." -#: includes/class.cooked-settings.php:455 +#: includes/class.cooked-settings.php:467 msgid "Disable Recipe Archive Page" msgstr "Désactiver la page d'archive des recettes" -#: includes/class.cooked-settings.php:466 +#: includes/class.cooked-settings.php:478 msgid "Design" msgstr "Design" -#: includes/class.cooked-settings.php:470 +#: includes/class.cooked-settings.php:482 msgid "Dark Mode" msgstr "Mode sombre" -#: includes/class.cooked-settings.php:487 +#: includes/class.cooked-settings.php:499 msgid "Author Images" msgstr "Images de l’auteur" -#: includes/class.cooked-settings.php:488 +#: includes/class.cooked-settings.php:500 msgid "If you do not want to display the author images (avatars), you can disable them here." msgstr "Si vous ne voulez pas afficher les images des auteurs (avatars), faites-le ici." -#: includes/class.cooked-settings.php:495 +#: includes/class.cooked-settings.php:507 msgid "Hide Author Images" msgstr "Masquer l'avatar de l’auteur" -#: includes/class.cooked-settings.php:506 +#: includes/class.cooked-settings.php:518 msgid "Main Color" msgstr "Couleur Principale" -#: includes/class.cooked-settings.php:507 +#: includes/class.cooked-settings.php:519 msgid "Used on buttons, cooking timer, etc." msgstr "Utilisée sur les boutons, minuteur, etc.." -#: includes/class.cooked-settings.php:513 +#: includes/class.cooked-settings.php:525 msgid "Main Color (on hover)" msgstr "Couleur Principale (au survol)" -#: includes/class.cooked-settings.php:514 +#: includes/class.cooked-settings.php:526 msgid "Used when hovering over buttons." msgstr "Utilisée lorsque vous passez la souris sur les boutons." -#: includes/class.cooked-settings.php:520 +#: includes/class.cooked-settings.php:532 msgid "First Responsive Breakpoint" msgstr "Premier Point de rupture Responsive" -#: includes/class.cooked-settings.php:521 +#: includes/class.cooked-settings.php:533 msgid "Set the first responsive breakpoint. Best for large tablets." msgstr "Définissez le premier point de rupture responsive. Utilisé pour les grandes tablettes." -#: includes/class.cooked-settings.php:527 +#: includes/class.cooked-settings.php:539 msgid "Second Responsive Breakpoint" msgstr "Second Point de rupture Responsive" -#: includes/class.cooked-settings.php:528 +#: includes/class.cooked-settings.php:540 msgid "Set the second responsive breakpoint. Best for small tablets." msgstr "Définissez le deuxième point de rupture responsive. Utilisé pour les petites tablettes." -#: includes/class.cooked-settings.php:534 +#: includes/class.cooked-settings.php:546 msgid "Third Responsive Breakpoint" msgstr "Troisième Point de rupture Responsive" -#: includes/class.cooked-settings.php:535 +#: includes/class.cooked-settings.php:547 msgid "Set the third responsive breakpoint. Best for phones and other small devices." msgstr "Définissez le troisième point de rupture responsive. Utilisé pour les smartphones." -#: includes/class.cooked-settings.php:543 +#: includes/class.cooked-settings.php:555 msgid "Permalinks" msgstr "Permaliens" -#: includes/class.cooked-settings.php:547 +#: includes/class.cooked-settings.php:559 msgid "Recipe Permalink" msgstr "Permalien de la recette" -#: includes/class.cooked-settings.php:550 +#: includes/class.cooked-settings.php:562 msgid "recipe-name" msgstr "nom-de-la-recette" -#: includes/class.cooked-settings.php:554 +#: includes/class.cooked-settings.php:566 msgid "Recipe Author Permalink" msgstr "Permalien de l’auteur de la recette" -#: includes/class.cooked-settings.php:557 +#: includes/class.cooked-settings.php:569 msgid "author-name" msgstr "nom-de-l-auteur" -#: includes/class.cooked-settings.php:561 +#: includes/class.cooked-settings.php:573 msgid "Recipe Category Permalink" msgstr "Permalien de la catégorie de recette" -#: includes/class.cooked-settings.php:564 +#: includes/class.cooked-settings.php:576 msgid "recipe-category-name" msgstr "nom-categorie-recette" #. translators: posts_per_page default -#: includes/class.cooked-settings.php:575 +#: includes/class.cooked-settings.php:587 #, php-format msgid "WordPress Default %s" msgstr "WordPress par défaut %s" -#: includes/class.cooked-settings.php:580 +#: includes/class.cooked-settings.php:592 msgid "Show All (no pagination)" msgstr "Afficher tout (sans pagination)" -#: includes/class.cooked-settings.php:724 +#: includes/class.cooked-settings.php:736 msgid "Begin Migration" msgstr "Commencez la migration" @@ -1459,6 +1463,7 @@ msgstr "kilogrammes" #: includes/class.cooked-measurements.php:45 #: includes/class.cooked-measurements.php:46 +#: includes/class.cooked-measurements.php:215 msgid "mg" msgstr "mg" @@ -1470,7 +1475,7 @@ msgstr "milligramme" msgid "milligrams" msgstr "milligrammes" -#: includes/class.cooked-measurements.php:471 +#: includes/class.cooked-measurements.php:216 msgid "mcg" msgstr "mcg" @@ -1716,232 +1721,232 @@ msgstr "boîte" msgid "cans" msgstr "boîtes" -#: includes/class.cooked-measurements.php:221 +#: includes/class.cooked-measurements.php:225 msgid "Serving size" msgstr "Taille de portion" -#: includes/class.cooked-measurements.php:228 +#: includes/class.cooked-measurements.php:232 msgid "Calories" msgstr "Calories" -#: includes/class.cooked-measurements.php:235 +#: includes/class.cooked-measurements.php:239 msgid "Total Fat" msgstr "Graisse totale" -#: includes/class.cooked-measurements.php:241 +#: includes/class.cooked-measurements.php:245 msgid "Saturated Fat" msgstr "Acides gras saturés" -#: includes/class.cooked-measurements.php:247 +#: includes/class.cooked-measurements.php:251 msgid "Trans Fat" msgstr "Acides gras insaturés" -#: includes/class.cooked-measurements.php:248 +#: includes/class.cooked-measurements.php:252 msgid "Trans Fat" msgstr "Graisses trans" -#: includes/class.cooked-measurements.php:253 +#: includes/class.cooked-measurements.php:257 msgid "Monounsaturated Fat" msgstr "Acides gras monoinsaturés" -#: includes/class.cooked-measurements.php:258 +#: includes/class.cooked-measurements.php:262 msgid "Polyunsaturated Fat" msgstr "Acides gras polyinsaturés" -#: includes/class.cooked-measurements.php:265 +#: includes/class.cooked-measurements.php:269 msgid "Cholesterol" msgstr "Cholesterol" -#: includes/class.cooked-measurements.php:271 +#: includes/class.cooked-measurements.php:275 msgid "Sodium" msgstr "Sodium" -#: includes/class.cooked-measurements.php:277 +#: includes/class.cooked-measurements.php:281 msgid "Total Carbohydrate" msgstr "Glucides totaux" -#: includes/class.cooked-measurements.php:277 +#: includes/class.cooked-measurements.php:281 msgid "Net Carbohydrate" msgstr "Glucides nets" -#: includes/class.cooked-measurements.php:283 +#: includes/class.cooked-measurements.php:287 msgid "Dietary Fiber" msgstr "Fibre alimentaire" -#: includes/class.cooked-measurements.php:289 +#: includes/class.cooked-measurements.php:293 msgid "Total Sugars" msgstr "Sucres totaux" -#: includes/class.cooked-measurements.php:295 +#: includes/class.cooked-measurements.php:299 msgid "Added Sugars" msgstr "Sucres ajoutés" -#: includes/class.cooked-measurements.php:303 +#: includes/class.cooked-measurements.php:307 msgid "Protein" msgstr "Protéine" -#: includes/class.cooked-measurements.php:312 +#: includes/class.cooked-measurements.php:316 msgid "Vitamin A" msgstr "Vitamine A" -#: includes/class.cooked-measurements.php:318 +#: includes/class.cooked-measurements.php:322 msgid "Vitamin C" msgstr "Vitamine C" -#: includes/class.cooked-measurements.php:324 +#: includes/class.cooked-measurements.php:328 msgid "Calcium" msgstr "Calcium" -#: includes/class.cooked-measurements.php:330 +#: includes/class.cooked-measurements.php:334 msgid "Iron" msgstr "Fer" -#: includes/class.cooked-measurements.php:336 +#: includes/class.cooked-measurements.php:340 msgid "Potassium" msgstr "Potassium" -#: includes/class.cooked-measurements.php:342 +#: includes/class.cooked-measurements.php:346 msgid "Vitamin D" msgstr "Vitamine D" -#: includes/class.cooked-measurements.php:348 +#: includes/class.cooked-measurements.php:352 msgid "Vitamin E" msgstr "Vitamine E" -#: includes/class.cooked-measurements.php:354 +#: includes/class.cooked-measurements.php:358 msgid "Vitamin K" msgstr "Vitamine K" -#: includes/class.cooked-measurements.php:360 +#: includes/class.cooked-measurements.php:364 msgid "Thiamin" msgstr "Vitamine B1 (Thiamin)" -#: includes/class.cooked-measurements.php:366 +#: includes/class.cooked-measurements.php:370 msgid "Riboflavin" msgstr "Vitamine B2 (Riboflavine)" -#: includes/class.cooked-measurements.php:372 +#: includes/class.cooked-measurements.php:376 msgid "Niacin" msgstr "Vitamine B3 (Niacine)" -#: includes/class.cooked-measurements.php:378 +#: includes/class.cooked-measurements.php:382 msgid "Vitamin B6" msgstr "Vitamine B6" -#: includes/class.cooked-measurements.php:384 +#: includes/class.cooked-measurements.php:388 msgid "Folate" msgstr "Vitamine B9 (Folate)" -#: includes/class.cooked-measurements.php:390 +#: includes/class.cooked-measurements.php:394 msgid "Vitamin B12" msgstr "Vitamine B12" -#: includes/class.cooked-measurements.php:396 +#: includes/class.cooked-measurements.php:400 msgid "Biotin" msgstr "Vitamine B8 (Biotine)" -#: includes/class.cooked-measurements.php:402 +#: includes/class.cooked-measurements.php:406 msgid "Pantothenic Acid" msgstr "Vitamine B5 (Acide pantothénique)" -#: includes/class.cooked-measurements.php:408 +#: includes/class.cooked-measurements.php:412 msgid "Phosphorus" msgstr "Phosphore" -#: includes/class.cooked-measurements.php:414 +#: includes/class.cooked-measurements.php:418 msgid "Iodine" msgstr "Iode" -#: includes/class.cooked-measurements.php:420 +#: includes/class.cooked-measurements.php:424 msgid "Magnesium" msgstr "Magnésium" -#: includes/class.cooked-measurements.php:426 +#: includes/class.cooked-measurements.php:430 msgid "Zinc" msgstr "Zinc" -#: includes/class.cooked-measurements.php:432 +#: includes/class.cooked-measurements.php:436 msgid "Selenium" msgstr "Sélénium" -#: includes/class.cooked-measurements.php:438 +#: includes/class.cooked-measurements.php:442 msgid "Copper" msgstr "Cuivre" -#: includes/class.cooked-measurements.php:444 +#: includes/class.cooked-measurements.php:448 msgid "Manganese" msgstr "Manganèse" -#: includes/class.cooked-measurements.php:450 +#: includes/class.cooked-measurements.php:454 msgid "Chromium" msgstr "Chromium" -#: includes/class.cooked-measurements.php:456 +#: includes/class.cooked-measurements.php:460 msgid "Molybdenum" msgstr "Molybdène" -#: includes/class.cooked-measurements.php:462 +#: includes/class.cooked-measurements.php:466 msgid "Chloride" msgstr "Chlorure" #. translators: singular and plural number of minutes (shorthand) -#: includes/class.cooked-measurements.php:721 -#: includes/class.cooked-measurements.php:732 -#: includes/class.cooked-measurements.php:750 +#: includes/class.cooked-measurements.php:722 +#: includes/class.cooked-measurements.php:733 +#: includes/class.cooked-measurements.php:751 #, php-format msgid "%d min" msgstr "%d min" #. translators: singular and plural number of minutes (shorthand) -#: includes/class.cooked-measurements.php:721 -#: includes/class.cooked-measurements.php:732 -#: includes/class.cooked-measurements.php:750 +#: includes/class.cooked-measurements.php:722 +#: includes/class.cooked-measurements.php:733 +#: includes/class.cooked-measurements.php:751 #, php-format msgid "%d mins" msgstr "%d mins" #. translators: singular and plural number of hours (shorthand) -#: includes/class.cooked-measurements.php:730 -#: includes/class.cooked-measurements.php:748 +#: includes/class.cooked-measurements.php:731 +#: includes/class.cooked-measurements.php:749 #, php-format msgid "%d hr" msgstr "%d h" #. translators: singular and plural number of hours (shorthand) -#: includes/class.cooked-measurements.php:730 -#: includes/class.cooked-measurements.php:748 +#: includes/class.cooked-measurements.php:731 +#: includes/class.cooked-measurements.php:749 #, php-format msgid "%d hrs" msgstr "%d h" #. translators: singular and plural number of days -#: includes/class.cooked-measurements.php:746 +#: includes/class.cooked-measurements.php:747 #, php-format msgid "%d day" msgstr "%d jour" #. translators: singular and plural number of days -#: includes/class.cooked-measurements.php:746 +#: includes/class.cooked-measurements.php:747 #, php-format msgid "%d days" msgstr "%d jours" #. translators: referring to the bottom of the Settings page. -#: includes/class.cooked-shortcodes.php:167 +#: includes/class.cooked-shortcodes.php:168 #, php-format msgid "Public recipes are currently disabled. You can change this at the bottom of the %s page." msgstr "Les recettes publiques sont actuellement désactivées. Vous pouvez le modifier en bas de la page %s." -#: includes/class.cooked-shortcodes.php:328 +#: includes/class.cooked-shortcodes.php:331 msgid "(recipe not found or in draft status)" msgstr "(recette introuvable ou en statut brouillon)" -#: includes/class.cooked-recipes.php:996 -#: includes/class.cooked-shortcodes.php:508 +#: includes/class.cooked-recipes.php:1001 +#: includes/class.cooked-shortcodes.php:512 msgid "Yields" msgstr "Portions" -#: includes/class.cooked-shortcodes.php:723 +#: includes/class.cooked-shortcodes.php:727 msgid "Fullscreen" msgstr "Plein écran" @@ -2041,49 +2046,49 @@ msgstr "min" #. translators: stating the recipe author with a "By" in front of it. (ex: "By John Smith") #. translators: referring to the author (ex: By John Smith) -#: includes/class.cooked-recipes.php:298 -#: includes/class.cooked-recipes.php:352 +#: includes/class.cooked-recipes.php:300 +#: includes/class.cooked-recipes.php:354 #: templates/front/recipe-single.php:47 #, php-format msgid "By %s" msgstr "Par %s" #. translators: For showing "All" of a taxonomy (ex: "All Burgers") -#: includes/class.cooked-recipes.php:445 +#: includes/class.cooked-recipes.php:449 #, php-format msgid "All %s" msgstr "Tous les %s" -#: includes/class.cooked-recipes.php:829 +#: includes/class.cooked-recipes.php:833 msgid "Beginner" msgstr "Facile" -#: includes/class.cooked-recipes.php:830 +#: includes/class.cooked-recipes.php:834 msgid "Intermediate" msgstr "Moyen" -#: includes/class.cooked-recipes.php:831 +#: includes/class.cooked-recipes.php:835 msgid "Advanced" msgstr "Avancé" -#: includes/class.cooked-recipes.php:857 +#: includes/class.cooked-recipes.php:861 msgid "Cooked Gallery" msgstr "Galerie de recette" -#: includes/class.cooked-recipes.php:861 +#: includes/class.cooked-recipes.php:865 msgid "Envira Gallery" msgstr "Galerie Envira" -#: includes/class.cooked-recipes.php:865 +#: includes/class.cooked-recipes.php:869 msgid "Soliloquy Slider" msgstr "Diaporama Soliloquy" -#: includes/class.cooked-recipes.php:869 +#: includes/class.cooked-recipes.php:873 msgid "Slider Revolution" msgstr "Slider Revolution" #. translators: singular and plural quarter "serving" size -#: includes/class.cooked-recipes.php:970 +#: includes/class.cooked-recipes.php:975 #, php-format msgid "Quarter (%s Serving)" msgid_plural "Quarter (%s Servings)" @@ -2091,7 +2096,7 @@ msgstr[0] "Quart (%s portion)" msgstr[1] "Quart (%s portions)" #. translators: singular and plural quarter "serving" size -#: includes/class.cooked-recipes.php:973 +#: includes/class.cooked-recipes.php:978 #, php-format msgid "Half (%s Serving)" msgid_plural "Half (%s Servings)" @@ -2099,7 +2104,7 @@ msgstr[0] "Demi (%s portion)" msgstr[1] "Demi (%s portions)" #. translators: singular and plural quarter "serving" size -#: includes/class.cooked-recipes.php:976 +#: includes/class.cooked-recipes.php:981 #, php-format msgid "Default (%s Serving)" msgid_plural "Default (%s Servings)" @@ -2107,56 +2112,56 @@ msgstr[0] "Par défaut (%s portion)" msgstr[1] "Par défaut (%s portions)" #. translators: singular and plural quarter "serving" size -#: includes/class.cooked-recipes.php:979 +#: includes/class.cooked-recipes.php:984 #, php-format msgid "Double (%s Servings)" msgstr "Double (%s portions)" #. translators: singular and plural quarter "serving" size -#: includes/class.cooked-recipes.php:982 +#: includes/class.cooked-recipes.php:987 #, php-format msgid "Triple (%s Servings)" msgstr "Triple (%s portions)" #. translators: singular and plural "serving" sizes -#: includes/class.cooked-recipes.php:1000 -#: includes/class.cooked-recipes.php:1011 +#: includes/class.cooked-recipes.php:1005 +#: includes/class.cooked-recipes.php:1016 #, php-format msgid "%s Serving" msgid_plural "%s Servings" msgstr[0] "%s portion" msgstr[1] "%s portions" -#: includes/class.cooked-recipes.php:1143 -#: includes/class.cooked-recipes.php:1157 +#: includes/class.cooked-recipes.php:1148 +#: includes/class.cooked-recipes.php:1162 msgid "or" msgstr "ou" -#: includes/class.cooked-recipes.php:1262 +#: includes/class.cooked-recipes.php:1267 msgid "Browse" msgstr "Parcourir" -#: includes/class.cooked-recipes.php:1356 +#: includes/class.cooked-recipes.php:1361 msgid "Find a recipe..." msgstr "Trouvez une recette..." -#: includes/class.cooked-recipes.php:1358 +#: includes/class.cooked-recipes.php:1363 msgid "Search" msgstr "Rechercher" -#: includes/class.cooked-recipes.php:1371 +#: includes/class.cooked-recipes.php:1376 msgid "Newest first" msgstr "Plus récentes en premier" -#: includes/class.cooked-recipes.php:1375 +#: includes/class.cooked-recipes.php:1380 msgid "Oldest first" msgstr "Les plus anciennes en premier" -#: includes/class.cooked-recipes.php:1379 +#: includes/class.cooked-recipes.php:1384 msgid "Alphabetical (A-Z)" msgstr "Ordre Alphabétique (A-Z)" -#: includes/class.cooked-recipes.php:1383 +#: includes/class.cooked-recipes.php:1388 msgid "Alphabetical (Z-A)" msgstr "Ordre Alphabétique (Z-A)" @@ -2229,15 +2234,15 @@ msgstr "Précalculer les recettes associées pour toutes les recettes publiées msgid "Last: %1$s · %2$s recipes" msgstr "Dernier : %1$s · %2$s recettes" -#: includes/class.cooked-admin-enqueues.php:173 +#: includes/class.cooked-admin-enqueues.php:176 msgid "Bulk Add Ingredients" msgstr "Ajout groupé d'ingrédients" -#: includes/class.cooked-admin-enqueues.php:174 +#: includes/class.cooked-admin-enqueues.php:177 msgid "Bulk Add Directions" msgstr "Ajout groupé d'instructions" -#: includes/class.cooked-admin-enqueues.php:175 +#: includes/class.cooked-admin-enqueues.php:178 msgid "" "2 cups flour\n" "1 tsp salt\n" @@ -2249,7 +2254,7 @@ msgstr "" "1/2 tasse de sucre\n" "3 gros œufs" -#: includes/class.cooked-admin-enqueues.php:176 +#: includes/class.cooked-admin-enqueues.php:179 msgid "" "Preheat oven to 350°F.\n" "Mix dry ingredients together.\n" @@ -2259,32 +2264,32 @@ msgstr "" "Mélanger les ingrédients secs.\n" "Ajouter les ingrédients humides et remuer." -#: includes/class.cooked-admin-enqueues.php:177 -#: includes/class.cooked-recipe-meta.php:1748 +#: includes/class.cooked-admin-enqueues.php:180 +#: includes/class.cooked-recipe-meta.php:1761 msgid "Section heading" msgstr "Titre de section" -#: includes/class.cooked-admin-enqueues.php:178 +#: includes/class.cooked-admin-enqueues.php:181 msgid "Parsing..." msgstr "Analyse..." -#: includes/class.cooked-admin-enqueues.php:179 +#: includes/class.cooked-admin-enqueues.php:182 msgid "Add Ingredients" msgstr "Ajouter les ingrédients" -#: includes/class.cooked-admin-enqueues.php:180 +#: includes/class.cooked-admin-enqueues.php:183 msgid "Add Directions" msgstr "Ajouter les instructions" -#: includes/class.cooked-admin-enqueues.php:184 +#: includes/class.cooked-admin-enqueues.php:187 msgid "Heading text" msgstr "Texte du titre" -#: includes/class.cooked-ajax.php:470 +#: includes/class.cooked-ajax.php:486 msgid "Security check failed." msgstr "Échec de la vérification de sécurité." -#: includes/class.cooked-ajax.php:476 +#: includes/class.cooked-ajax.php:492 msgid "No ingredients provided." msgstr "Aucun ingrédient fourni." @@ -2387,314 +2392,321 @@ msgstr "Aucun outil disponible." msgid "Row %1$d: Unknown error" msgstr "Ligne %1$d : erreur inconnue" +#. translators: 1: CSV row number, 2: error message #. translators: 1: row number, 2: error message -#: includes/class.cooked-csv-import.php:123 -#: includes/class.cooked-csv-import.php:188 +#: includes/class.cooked-csv-import.php:124 +#: includes/class.cooked-csv-import.php:189 #, php-format msgid "Row %1$d: %2$s" msgstr "Ligne %1$d : %2$s" #. translators: %d: row number -#: includes/class.cooked-csv-import.php:156 +#: includes/class.cooked-csv-import.php:157 #, php-format msgid "Row %1$d: Title is required" msgstr "Ligne %1$d : le titre est obligatoire" -#: includes/class.cooked-import.php:155 +#: includes/class.cooked-import.php:159 msgid "Excerpt/description" msgstr "Extrait/description" -#: includes/class.cooked-import.php:159 +#: includes/class.cooked-import.php:163 msgid "Ingredients, separated by pipe (|).
Format: \"amount|measurement|name\" or \"name\" for simple ingredients.
Add substitutions with double pipe (||): \"amount|measurement|name||sub_amount|sub_measurement|sub_name\"" msgstr "Ingrédients séparés par une barre verticale (|).
Format : \"quantité|mesure|nom\" ou \"nom\" pour les ingrédients simples.
Ajoutez les substitutions avec une double barre (||) : \"quantité|mesure|nom||sub_quantité|sub_mesure|sub_nom\"" -#: includes/class.cooked-import.php:160 +#: includes/class.cooked-import.php:164 msgid "Directions/instructions, separated by pipe (|)" msgstr "Instructions séparées par une barre verticale (|)" -#: includes/class.cooked-import.php:162 +#: includes/class.cooked-import.php:166 msgid "Category, separated by comma" msgstr "Catégorie, séparée par des virgules" -#: includes/class.cooked-import.php:164 +#: includes/class.cooked-import.php:168 msgid "Cuisine, separated by comma" msgstr "Cuisine, séparée par des virgules" -#: includes/class.cooked-import.php:165 +#: includes/class.cooked-import.php:169 msgid "Cooking method, separated by comma" msgstr "Méthode de cuisson, séparée par des virgules" -#: includes/class.cooked-import.php:166 +#: includes/class.cooked-import.php:170 msgid "Tags, separated by comma" msgstr "Étiquettes, séparées par des virgules" -#: includes/class.cooked-import.php:167 +#: includes/class.cooked-import.php:171 msgid "Restricted diet type (Schema.org RestrictedDiet), separated by comma" msgstr "Type de régime restreint (Schema.org RestrictedDiet), séparé par des virgules" -#: includes/class.cooked-multilingual.php:260 +#: includes/class.cooked-multilingual.php:262 msgid "Multilingual Setup:" msgstr "Configuration multilingue :" -#: includes/class.cooked-multilingual.php:261 +#: includes/class.cooked-multilingual.php:263 msgid "Your Browse/Search Recipes page is missing translations for:" msgstr "Votre page Parcourir/Rechercher des recettes n'a pas de traductions pour :" #. translators: %s is the multilingual plugin name (Polylang or WPML) -#: includes/class.cooked-multilingual.php:266 +#: includes/class.cooked-multilingual.php:268 #, php-format msgid "Create translations of your browse page in %s for full multilingual support." msgstr "Créez des traductions de votre page parcourir en %s pour une prise en charge multilingue complète." -#: includes/class.cooked-recipe-meta.php:217 +#. translators: %s: recipe embed shortcode +#: includes/class.cooked-recipe-meta.php:229 #, php-format msgid "This recipe is set up to include itself in the Recipe Template (containing shortcode %s), which can break the page. Remove the embed that references this same recipe." msgstr "Cette recette est configurée pour s'inclure elle-même dans le modèle de recette (contenant le shortcode %s), ce qui peut casser la page. Supprimez l'intégration qui référence cette même recette." -#: includes/class.cooked-recipe-meta.php:258 +#: includes/class.cooked-recipe-meta.php:271 msgid "Enter one item per line. Use the checkboxes below to mark section headings." msgstr "Saisissez un élément par ligne. Utilisez les cases ci-dessous pour marquer les titres de section." -#: includes/class.cooked-recipe-meta.php:261 +#: includes/class.cooked-recipe-meta.php:274 msgid "Preview" msgstr "Aperçu" -#: includes/class.cooked-recipe-meta.php:265 +#: includes/class.cooked-recipe-meta.php:278 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 "Veuillez vérifier les champs analysés avant d'ajouter. L'analyse automatique peut mal interpréter les quantités — par exemple, une plage 2-3 peut apparaître comme 23 si vous ne la corrigez pas." -#: includes/class.cooked-recipe-meta.php:270 +#: includes/class.cooked-recipe-meta.php:283 msgid "Cancel" msgstr "Annuler" -#: includes/class.cooked-recipe-meta.php:301 +#: includes/class.cooked-recipe-meta.php:314 msgid "Recipe Card" msgstr "Carte de recette" -#: includes/class.cooked-recipe-meta.php:302 +#: includes/class.cooked-recipe-meta.php:315 msgid "Displays a compact linked recipe card with image, title, author, and excerpt — not the full recipe. Use this to promote this recipe elsewhere on your site." msgstr "Affiche une carte de recette compacte avec image, titre, auteur et extrait — pas la recette complète. Utilisez-la pour promouvoir cette recette ailleurs sur votre site." -#: includes/class.cooked-recipe-meta.php:310 +#: includes/class.cooked-recipe-meta.php:323 msgid "Choose \"modern\" or \"modern-centered\"." msgstr "Choisissez « modern » ou « modern-centered »." -#: includes/class.cooked-recipe-meta.php:317 +#: includes/class.cooked-recipe-meta.php:330 msgid "Set the card width. Defaults to 100%. Use \"%\" or \"px\" after the number." msgstr "Définissez la largeur de la carte. Par défaut 100 %. Utilisez « % » ou « px » après le nombre." -#: includes/class.cooked-recipe-meta.php:327 +#: includes/class.cooked-recipe-meta.php:340 msgid "Hide the recipe excerpt." msgstr "Masquer l'extrait de la recette." -#: includes/class.cooked-recipe-meta.php:334 +#: includes/class.cooked-recipe-meta.php:347 msgid "Hide the recipe author." msgstr "Masquer l'auteur de la recette." -#: includes/class.cooked-recipe-meta.php:344 +#: includes/class.cooked-recipe-meta.php:357 msgid "Hide the recipe image." msgstr "Masquer l'image de la recette." -#: includes/class.cooked-recipe-meta.php:351 +#: includes/class.cooked-recipe-meta.php:364 msgid "Hide the recipe title." msgstr "Masquer le titre de la recette." -#: includes/class.cooked-recipe-meta.php:363 -#: includes/class.cooked-recipe-meta.php:1747 +#: includes/class.cooked-recipe-meta.php:376 +#: includes/class.cooked-recipe-meta.php:1760 msgid "Recipe ID" msgstr "ID de recette" -#: includes/class.cooked-recipe-meta.php:364 +#: includes/class.cooked-recipe-meta.php:377 msgid "Card width" msgstr "Largeur de la carte" -#: includes/class.cooked-recipe-meta.php:365 +#: includes/class.cooked-recipe-meta.php:378 msgid "modern, modern-centered" msgstr "modern, modern-centered" -#: includes/class.cooked-recipe-meta.php:366 -#: includes/class.cooked-recipe-meta.php:367 -#: includes/class.cooked-recipe-meta.php:368 -#: includes/class.cooked-recipe-meta.php:369 -#: includes/class.cooked-recipe-meta.php:1751 -#: includes/class.cooked-recipe-meta.php:1752 -#: includes/class.cooked-recipe-meta.php:1753 -#: includes/class.cooked-recipe-meta.php:1754 +#: includes/class.cooked-recipe-meta.php:379 +#: includes/class.cooked-recipe-meta.php:380 +#: includes/class.cooked-recipe-meta.php:381 +#: includes/class.cooked-recipe-meta.php:382 +#: includes/class.cooked-recipe-meta.php:1764 +#: includes/class.cooked-recipe-meta.php:1765 +#: includes/class.cooked-recipe-meta.php:1766 +#: includes/class.cooked-recipe-meta.php:1767 msgid "true/false" msgstr "true/false" -#: includes/class.cooked-recipe-meta.php:371 -#: includes/class.cooked-recipe-meta.php:1756 +#: includes/class.cooked-recipe-meta.php:384 +#: includes/class.cooked-recipe-meta.php:1769 msgid "Example" msgstr "Exemple" -#: includes/class.cooked-recipe-meta.php:797 -#: includes/class.cooked-recipe-meta.php:1021 +#: includes/class.cooked-recipe-meta.php:810 +#: includes/class.cooked-recipe-meta.php:1034 msgid "Bulk Add" msgstr "Ajout groupé" -#: includes/class.cooked-recipe-meta.php:1640 +#: includes/class.cooked-recipe-meta.php:1653 msgid "Next & Previous Recipe Navigation" msgstr "Navigation recette suivante et précédente" -#: includes/class.cooked-recipe-meta.php:1641 +#: includes/class.cooked-recipe-meta.php:1654 msgid "This will display navigation links to the next and previous recipes." msgstr "Affiche les liens de navigation vers les recettes suivante et précédente." -#: includes/class.cooked-recipe-meta.php:1645 +#: includes/class.cooked-recipe-meta.php:1658 msgid "This shortcode automatically displays the previous and next recipe links based on the current recipe page. No parameters are required." msgstr "Ce shortcode affiche automatiquement les liens vers la recette précédente et suivante selon la page actuelle. Aucun paramètre requis." -#: includes/class.cooked-recipe-meta.php:1650 +#: includes/class.cooked-recipe-meta.php:1663 msgid "Usage" msgstr "Utilisation" -#: includes/class.cooked-recipe-meta.php:1652 +#: includes/class.cooked-recipe-meta.php:1665 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 "Ajoutez simplement le shortcode à votre modèle de recette ou zone de contenu. La navigation affichera automatiquement les recettes précédente et suivante selon l'ordre des ID." -#: includes/class.cooked-recipe-meta.php:1665 +#: includes/class.cooked-recipe-meta.php:1678 #: includes/class.cooked-related-recipes.php:34 msgid "Related Recipes" msgstr "Recettes associées" -#: includes/class.cooked-recipe-meta.php:1666 +#: includes/class.cooked-recipe-meta.php:1679 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 "Affiche une grille de recettes associées selon les termes partagés dans les taxonomies (catégories, cuisines, méthodes de cuisson, étiquettes, régimes), dans un ordre aléatoire. Sans cache ni précalcul." -#: includes/class.cooked-recipe-meta.php:1674 +#: includes/class.cooked-recipe-meta.php:1687 msgid "Specify a recipe ID. If not provided, uses the current recipe." msgstr "Indiquez un ID de recette. Sinon, la recette actuelle est utilisée." -#: includes/class.cooked-recipe-meta.php:1681 +#: includes/class.cooked-recipe-meta.php:1694 msgid "Set the heading text for the related recipes section." msgstr "Définissez le texte du titre de la section recettes associées." -#: includes/class.cooked-recipe-meta.php:1691 +#: includes/class.cooked-recipe-meta.php:1704 msgid "Number of recipes to display (default: 4)." msgstr "Nombre de recettes à afficher (par défaut : 4)." -#: includes/class.cooked-recipe-meta.php:1698 +#: includes/class.cooked-recipe-meta.php:1711 msgid "Number of columns in the grid (default: 2)." msgstr "Nombre de colonnes dans la grille (par défaut : 2)." -#: includes/class.cooked-recipe-meta.php:1708 +#: includes/class.cooked-recipe-meta.php:1721 msgid "Hide recipe card images." msgstr "Masquer les images des cartes de recettes." -#: includes/class.cooked-recipe-meta.php:1715 +#: includes/class.cooked-recipe-meta.php:1728 msgid "Hide recipe card excerpts." msgstr "Masquer les extraits des cartes de recettes." -#: includes/class.cooked-recipe-meta.php:1725 +#: includes/class.cooked-recipe-meta.php:1738 msgid "Hide recipe card authors." msgstr "Masquer les auteurs des cartes de recettes." -#: includes/class.cooked-recipe-meta.php:1732 +#: includes/class.cooked-recipe-meta.php:1745 msgid "Toggle which taxonomies are used: match_categories, match_cuisines, match_cooking_methods, match_tags, match_diets (default: true)." msgstr "Activez les taxonomies utilisées : match_categories, match_cuisines, match_cooking_methods, match_tags, match_diets (par défaut : true)." -#: includes/class.cooked-recipe-meta.php:1739 +#: includes/class.cooked-recipe-meta.php:1752 msgid "Matching options:" msgstr "Options de correspondance :" -#: includes/class.cooked-recipe-meta.php:1740 +#: includes/class.cooked-recipe-meta.php:1753 msgid "Set to false to exclude a taxonomy from related recipes, e.g. match_cuisines=\"false\" to ignore cuisines." msgstr "Mettez false pour exclure une taxonomie, ex. match_cuisines=\"false\" pour ignorer les cuisines." -#: includes/class.cooked-recipe-meta.php:1749 +#: includes/class.cooked-recipe-meta.php:1762 msgid "Number of recipes" msgstr "Nombre de recettes" -#: includes/class.cooked-recipe-meta.php:1750 +#: includes/class.cooked-recipe-meta.php:1763 msgid "Grid columns" msgstr "Colonnes de la grille" -#: includes/class.cooked-settings.php:337 +#: includes/class.cooked-settings.php:349 msgid "Print View" msgstr "Vue d'impression" -#: includes/class.cooked-shortcodes.php:359 +#. translators: %s: recipe embed shortcode +#: includes/class.cooked-shortcodes.php:363 #, php-format msgid "This recipe could not be displayed because it is set up to include itself (containing shortcode %s). Remove the duplicate recipe embed from the Recipe Template." msgstr "Cette recette n'a pas pu être affichée car elle est configurée pour s'inclure elle-même (shortcode %s). Supprimez l'intégration en double du modèle de recette." -#: includes/class.cooked-shortcodes.php:1175 +#: includes/class.cooked-shortcodes.php:1179 msgid "Invalid recipe ID specified. Please provide a valid numeric recipe ID." msgstr "ID de recette invalide. Veuillez fournir un ID numérique valide." -#: includes/class.cooked-shortcodes.php:1185 +#: includes/class.cooked-shortcodes.php:1189 msgid "No recipe found. Please specify a recipe ID using the id attribute, or use this shortcode on a recipe page." msgstr "Aucune recette trouvée. Indiquez un ID avec l'attribut id, ou utilisez ce shortcode sur une page de recette." -#: includes/class.cooked-shortcodes.php:1192 +#: includes/class.cooked-shortcodes.php:1196 msgid "Recipe not found." msgstr "Recette introuvable." -#: includes/class.cooked-shortcodes.php:1196 +#. translators: %d: post ID +#: includes/class.cooked-shortcodes.php:1201 #, php-format msgid "The specified ID (%d) is not a recipe." msgstr "L'ID spécifié (%d) n'est pas une recette." -#: includes/class.cooked-shortcodes.php:1198 +#. translators: %d: post ID +#: includes/class.cooked-shortcodes.php:1204 #, php-format msgid "No post found with ID %d." msgstr "Aucun article trouvé avec l'ID %d." -#: includes/class.cooked-shortcodes.php:1207 +#: includes/class.cooked-shortcodes.php:1213 msgid "No related recipes found." msgstr "Aucune recette associée trouvée." -#: includes/class.cooked-shortcodes.php:1210 +#: includes/class.cooked-shortcodes.php:1216 msgid "This may be because there are no other recipes in the current language with matching attributes." msgstr "Cela peut être dû à l'absence d'autres recettes dans la langue actuelle avec des attributs correspondants." -#: includes/class.cooked-shortcodes.php:1212 +#: includes/class.cooked-shortcodes.php:1218 msgid "Try adjusting the matching criteria or ensure you have other published recipes with shared categories, tags, or ingredients." msgstr "Ajustez les critères de correspondance ou assurez-vous d'avoir d'autres recettes publiées avec des catégories, étiquettes ou ingrédients communs." -#: includes/class.cooked-updates.php:150 +#: includes/class.cooked-updates.php:167 msgid "Flush rewrite rules" msgstr "Vider les règles de réécriture" -#: includes/class.cooked-updates.php:151 +#: includes/class.cooked-updates.php:168 msgid "Refreshes permalink rules for recipe and profile URLs." msgstr "Actualise les règles de permaliens pour les URLs de recettes et de profils." -#: includes/class.cooked-updates.php:154 +#: includes/class.cooked-updates.php:171 msgid "Fix recipe line endings" msgstr "Corriger les fins de ligne des recettes" -#: includes/class.cooked-updates.php:155 +#: includes/class.cooked-updates.php:172 msgid "Normalizes line endings in recipe content for exporter/importer compatibility." msgstr "Normalise les fins de ligne du contenu des recettes pour la compatibilité export/import." -#: includes/class.cooked-updates.php:158 +#: includes/class.cooked-updates.php:175 msgid "Purge legacy related recipes cache" msgstr "Purger l'ancien cache des recettes associées" -#: includes/class.cooked-updates.php:159 +#: includes/class.cooked-updates.php:176 msgid "Removes old transients and options from the previous related-recipes cache." msgstr "Supprime les anciens transients et options de l'ancien cache des recettes associées." -#: includes/class.cooked-updates.php:162 +#: includes/class.cooked-updates.php:179 msgid "Remove recipes from user meta" msgstr "Supprimer les recettes des métadonnées utilisateur" -#: includes/class.cooked-updates.php:163 +#: includes/class.cooked-updates.php:180 msgid "Removes the legacy \"recipes\" key from all users' cooked_user_meta." msgstr "Supprime l'ancienne clé « recipes » des cooked_user_meta de tous les utilisateurs." -#: includes/class.cooked-updates.php:196 +#: includes/class.cooked-updates.php:213 msgid "Tool name is required." msgstr "Le nom de l'outil est obligatoire." -#: includes/class.cooked-updates.php:207 +#. translators: %s: site health tool name +#: includes/class.cooked-updates.php:225 #, php-format msgid "Unknown tool: %s." msgstr "Outil inconnu : %s." -#: includes/class.cooked-updates.php:210 +#. translators: %s: PHP method name +#: includes/class.cooked-updates.php:229 #, php-format msgid "Tool method %s does not exist." msgstr "La méthode d'outil %s n'existe pas." @@ -2719,6 +2731,7 @@ msgstr "Valeurs nutritionnelles automatiques" msgid "Use coupon code %1$s for %2$s off!" msgstr "Utilisez le code promo %1$s pour %2$s de réduction !" +#. translators: 1: plugin name, 2: Settings link, 3: documentation link, 4: Discord link #: templates/admin/welcome.php:16 #, php-format msgid "If this is your first time using %1$s, head over to the %2$s page for some initial configuration. You can also check out the %3$s if you get stuck or contact me on %4$s. If you just recently updated, you can find out what's new below." @@ -2748,19 +2761,19 @@ msgstr "Gora Tech" msgid "https://goratech.dev" msgstr "https://goratech.dev" -#: includes/class.cooked-import.php:220 +#: includes/class.cooked-import.php:224 msgid "Download sample CSV files:" msgstr "Télécharger des fichiers CSV d’exemple :" -#: includes/class.cooked-import.php:221 +#: includes/class.cooked-import.php:225 msgid "Small (1 recipe)" msgstr "Petit (1 recette)" -#: includes/class.cooked-import.php:222 +#: includes/class.cooked-import.php:226 msgid "Medium (3 recipes)" msgstr "Moyen (3 recettes)" -#: includes/class.cooked-import.php:223 +#: includes/class.cooked-import.php:227 msgid "Large (10 recipes)" msgstr "Grand (10 recettes)" @@ -2784,39 +2797,39 @@ msgctxt "Kilograms Abbreviation (Plural)" msgid "kg" msgstr "kg" -#: includes/class.cooked-recipes.php:935 -#: includes/class.cooked-recipes.php:945 +#: includes/class.cooked-recipes.php:939 +#: includes/class.cooked-recipes.php:949 msgid "Default" msgstr "Par défaut" -#: includes/class.cooked-recipes.php:936 -#: includes/class.cooked-recipes.php:946 +#: includes/class.cooked-recipes.php:940 +#: includes/class.cooked-recipes.php:950 msgid "Metric" msgstr "Métrique" -#: includes/class.cooked-recipes.php:937 -#: includes/class.cooked-recipes.php:947 +#: includes/class.cooked-recipes.php:941 +#: includes/class.cooked-recipes.php:951 msgid "Imperial" msgstr "Impérial" -#: includes/class.cooked-recipes.php:941 +#: includes/class.cooked-recipes.php:945 msgid "Units" msgstr "Unités" -#: includes/class.cooked-recipes.php:943 +#: includes/class.cooked-recipes.php:947 msgid "Measurement System" msgstr "Système de mesure" -#: includes/class.cooked-settings.php:453 +#: includes/class.cooked-settings.php:465 msgid "Enable \"Measurement System Switcher\"" msgstr "Activer le « sélecteur de système de mesure »" -#: includes/class.cooked-settings.php:453 +#: includes/class.cooked-settings.php:465 msgid "Shows the Metric/Imperial toggle on recipes." msgstr "Affiche la bascule Métrique/Impérial sur les recettes." #. translators: %s: recipe archive URL, e.g. https://example.com/recipe-archive -#: includes/class.cooked-settings.php:457 +#: includes/class.cooked-settings.php:469 #, php-format msgid "Prevents the recipe archive from being displayed at %s." msgstr "Empêche l’affichage de l’archive des recettes à l’adresse %s." @@ -2897,7 +2910,7 @@ msgstr "Obtenir %s" msgid "Update Settings" msgstr "Mettre à jour les paramètres" -#: includes/class.cooked-recipe-meta.php:118 +#: includes/class.cooked-recipe-meta.php:124 #: templates/admin/settings.php:10 #: templates/admin/welcome.php:33 msgid "Cooked Settings" @@ -2932,14 +2945,14 @@ msgid "Recipes by %s" msgstr "Recettes par %s" #: includes/class.cooked-admin-enqueues.php:141 -#: includes/class.cooked-recipe-meta.php:922 -#: includes/class.cooked-recipe-meta.php:1002 -#: includes/class.cooked-recipe-meta.php:1040 +#: includes/class.cooked-recipe-meta.php:935 +#: includes/class.cooked-recipe-meta.php:1015 +#: includes/class.cooked-recipe-meta.php:1053 msgid "Add Video" msgstr "Ajouter une vidéo" #: includes/class.cooked-admin-enqueues.php:142 -#: includes/class.cooked-recipe-meta.php:922 +#: includes/class.cooked-recipe-meta.php:935 msgid "Change Video" msgstr "Changer la vidéo" @@ -2963,34 +2976,48 @@ msgstr " et définissez le mode sombre sur Auto." msgid "Pixwell's dark mode toggle is enabled. Choose Auto so Cooked follows it when visitors switch themes." msgstr "La bascule de mode sombre de Pixwell est activée. Choisissez Auto pour que Cooked la suive lorsque les visiteurs changent de thème." -#: includes/class.cooked-settings.php:338 +#: includes/class.cooked-settings.php:350 msgid "When enabled, the website logo will appear at the top of the recipe print screen." msgstr "Lorsque cette option est activée, le logo du site apparaît en haut de l'écran d'impression de la recette." -#: includes/class.cooked-settings.php:344 +#: includes/class.cooked-settings.php:356 msgid "Show Website Logo" msgstr "Afficher le logo du site" -#: includes/class.cooked-settings.php:473 +#: includes/class.cooked-settings.php:485 msgid "Use Auto if your theme has a visitor dark mode toggle. Cooked will then match that choice. Otherwise leave this Off." msgstr "Utilisez Auto si votre thème propose une bascule de mode sombre pour les visiteurs. Cooked suivra alors ce choix. Sinon, laissez cette option sur Désactivé." -#: includes/class.cooked-settings.php:480 +#: includes/class.cooked-settings.php:492 msgid "Off" msgstr "Désactivé" -#: includes/class.cooked-settings.php:481 +#: includes/class.cooked-settings.php:493 msgid "On" msgstr "Activé" -#: includes/class.cooked-settings.php:482 +#: includes/class.cooked-settings.php:494 msgid "Auto (match theme dark mode)" msgstr "Auto (suivre le mode sombre du thème)" -#: includes/class.cooked-settings.php:500 +#: includes/class.cooked-settings.php:512 msgid "Default Recipe Image" msgstr "Image de recette par défaut" -#: includes/class.cooked-settings.php:501 +#: includes/class.cooked-settings.php:513 msgid "Used as the featured image for recipes that do not have one set." msgstr "Utilisée comme image mise en avant pour les recettes qui n’en ont pas." + +#: includes/class.cooked-measurements.php:214 +msgid "g" +msgstr "g" + +#: includes/class.cooked-post-types.php:466 +msgctxt "post type general name" +msgid "Recipes" +msgstr "Recettes" + +#: includes/class.cooked-post-types.php:467 +msgctxt "post type singular name" +msgid "Recipe" +msgstr "Recette" diff --git a/languages/cooked.po b/languages/cooked.po index bb298cf..0d7ab28 100644 --- a/languages/cooked.po +++ b/languages/cooked.po @@ -36,16 +36,16 @@ msgid "remaining" msgstr "" #: includes/class.cooked-admin-enqueues.php:138 -#: includes/class.cooked-recipe-meta.php:912 -#: includes/class.cooked-recipe-meta.php:979 -#: includes/class.cooked-recipe-meta.php:1030 -#: includes/class.cooked-settings.php:802 +#: includes/class.cooked-recipe-meta.php:925 +#: includes/class.cooked-recipe-meta.php:992 +#: includes/class.cooked-recipe-meta.php:1043 +#: includes/class.cooked-settings.php:814 msgid "Add Image" msgstr "" #: includes/class.cooked-admin-enqueues.php:139 -#: includes/class.cooked-recipe-meta.php:912 -#: includes/class.cooked-settings.php:802 +#: includes/class.cooked-recipe-meta.php:925 +#: includes/class.cooked-settings.php:814 msgid "Change Image" msgstr "" @@ -54,7 +54,7 @@ msgid "Use this Image" msgstr "" #: includes/class.cooked-admin-enqueues.php:144 -#: includes/class.cooked-recipe-meta.php:1269 +#: includes/class.cooked-recipe-meta.php:1282 msgid "Add to Gallery" msgstr "" @@ -94,22 +94,22 @@ msgstr "" #: includes/class.cooked-admin-menus.php:36 #: includes/class.cooked-admin-menus.php:59 -#: includes/class.cooked-post-types.php:451 -#: includes/class.cooked-post-types.php:463 +#: includes/class.cooked-post-types.php:468 +#: includes/class.cooked-post-types.php:480 #: includes/class.cooked-users.php:166 msgid "Recipes" msgstr "" #: includes/class.cooked-admin-menus.php:37 #: includes/class.cooked-admin-menus.php:61 -#: includes/class.cooked-post-types.php:453 +#: includes/class.cooked-post-types.php:470 msgid "Add New" msgstr "" #. translators: referring to the bottom of the Settings page. #: includes/class.cooked-admin-menus.php:45 #: includes/class.cooked-admin-menus.php:65 -#: includes/class.cooked-shortcodes.php:167 +#: includes/class.cooked-shortcodes.php:168 #: templates/admin/welcome.php:18 msgid "Settings" msgstr "" @@ -128,7 +128,7 @@ msgid "Upgrade to Pro" msgstr "" #: includes/class.cooked-admin-menus.php:60 -#: includes/class.cooked-post-types.php:458 +#: includes/class.cooked-post-types.php:475 msgid "All Recipes" msgstr "" @@ -139,30 +139,30 @@ msgstr "" msgid "You do not have sufficient permissions to access this page." msgstr "" -#: includes/class.cooked-ajax.php:187 -#: includes/class.cooked-csv-import.php:392 +#: includes/class.cooked-ajax.php:207 +#: includes/class.cooked-csv-import.php:393 #: includes/class.cooked-functions.php:134 -#: includes/class.cooked-recipe-meta.php:177 -#: includes/class.cooked-recipe-meta.php:415 -#: includes/class.cooked-recipe-meta.php:1347 -#: includes/class.cooked-recipes.php:740 -#: includes/class.cooked-recipes.php:772 +#: includes/class.cooked-recipe-meta.php:187 +#: includes/class.cooked-recipe-meta.php:428 +#: includes/class.cooked-recipe-meta.php:1360 +#: includes/class.cooked-recipes.php:744 +#: includes/class.cooked-recipes.php:776 msgid "Ingredients" msgstr "" -#: includes/class.cooked-ajax.php:187 -#: includes/class.cooked-csv-import.php:392 +#: includes/class.cooked-ajax.php:207 +#: includes/class.cooked-csv-import.php:393 #: includes/class.cooked-functions.php:135 -#: includes/class.cooked-recipe-meta.php:177 -#: includes/class.cooked-recipe-meta.php:421 -#: includes/class.cooked-recipe-meta.php:1378 -#: includes/class.cooked-recipes.php:744 -#: includes/class.cooked-recipes.php:773 +#: includes/class.cooked-recipe-meta.php:187 +#: includes/class.cooked-recipe-meta.php:434 +#: includes/class.cooked-recipe-meta.php:1391 +#: includes/class.cooked-recipes.php:748 +#: includes/class.cooked-recipes.php:777 msgid "Directions" msgstr "" #: includes/class.cooked-enqueues.php:56 -#: includes/class.cooked-recipe-meta.php:1593 +#: includes/class.cooked-recipe-meta.php:1606 msgid "Timer" msgstr "" @@ -173,7 +173,7 @@ msgid "What's new in %s?" msgstr "" #: includes/class.cooked-functions.php:127 -#: includes/class.cooked-shortcodes.php:717 +#: includes/class.cooked-shortcodes.php:721 msgid "Print" msgstr "" @@ -190,8 +190,8 @@ msgid "Information" msgstr "" #: includes/class.cooked-functions.php:132 -#: includes/class.cooked-recipe-meta.php:1538 -#: includes/class.cooked-settings.php:327 +#: includes/class.cooked-recipe-meta.php:1551 +#: includes/class.cooked-settings.php:339 msgid "Excerpt" msgstr "" @@ -200,108 +200,108 @@ msgid "Images" msgstr "" #: includes/class.cooked-functions.php:136 -#: includes/class.cooked-import.php:161 -#: includes/class.cooked-recipe-meta.php:1562 -#: includes/class.cooked-recipes.php:747 -#: includes/class.cooked-settings.php:328 -#: includes/class.cooked-shortcodes.php:836 +#: includes/class.cooked-import.php:165 +#: includes/class.cooked-recipe-meta.php:1575 +#: includes/class.cooked-recipes.php:751 +#: includes/class.cooked-settings.php:340 +#: includes/class.cooked-shortcodes.php:840 msgid "Notes" msgstr "" #: includes/class.cooked-functions.php:137 -#: includes/class.cooked-recipe-meta.php:427 +#: includes/class.cooked-recipe-meta.php:440 msgid "Nutrition" msgstr "" #. translators: for displaying singular or plural versions depending on the number of recipes. -#: includes/class.cooked-import.php:46 -#: includes/class.cooked-import.php:100 +#: includes/class.cooked-import.php:50 +#: includes/class.cooked-import.php:104 #, php-format msgid "There is %1$s recipe that should be imported from %2$s." msgid_plural "There are %1$s recipes that should be imported from %2$s." msgstr[0] "" msgstr[1] "" -#: includes/class.cooked-import.php:48 -#: includes/class.cooked-import.php:102 +#: includes/class.cooked-import.php:52 +#: includes/class.cooked-import.php:106 msgid "Before you begin, please make sure you backup your database in case something goes wrong." msgstr "" -#: includes/class.cooked-import.php:50 -#: includes/class.cooked-import.php:104 +#: includes/class.cooked-import.php:54 +#: includes/class.cooked-import.php:108 msgid "Click the button below to import these recipes. Here is what will happen to your recipes:" msgstr "" -#: includes/class.cooked-import.php:52 -#: includes/class.cooked-import.php:106 +#: includes/class.cooked-import.php:56 +#: includes/class.cooked-import.php:110 msgid "Recipes will be imported with the 'Draft' status." msgstr "" -#: includes/class.cooked-import.php:53 -#: includes/class.cooked-import.php:107 +#: includes/class.cooked-import.php:57 +#: includes/class.cooked-import.php:111 msgid "Comments and ratings data will also be imported (ratings are available in Cooked Pro)." msgstr "" -#: includes/class.cooked-import.php:54 -#: includes/class.cooked-import.php:109 +#: includes/class.cooked-import.php:58 +#: includes/class.cooked-import.php:113 msgid "After the import is complete, you can bulk edit the recipes and change their status to 'Published'." msgstr "" -#: includes/class.cooked-import.php:55 +#: includes/class.cooked-import.php:59 msgid "The existing WP Delicious recipes and data will not be modified or deleted." msgstr "" -#: includes/class.cooked-import.php:56 -#: includes/class.cooked-import.php:111 +#: includes/class.cooked-import.php:60 +#: includes/class.cooked-import.php:115 msgid "Certain data that is not suppoted by Cooked will not be imported (such as Cooking Temp, Estimated Cost, Recipe Keywords, etc)." msgstr "" -#: includes/class.cooked-import.php:57 -#: includes/class.cooked-import.php:112 +#: includes/class.cooked-import.php:61 +#: includes/class.cooked-import.php:116 msgid "You can run the import multiple times, but keep in mind that duplicate recipes will be created." msgstr "" -#: includes/class.cooked-import.php:61 -#: includes/class.cooked-import.php:116 +#: includes/class.cooked-import.php:65 +#: includes/class.cooked-import.php:120 #: includes/class.cooked-migration.php:58 msgid "Wow, you have a lot of recipes!" msgstr "" -#: includes/class.cooked-import.php:61 -#: includes/class.cooked-import.php:116 +#: includes/class.cooked-import.php:65 +#: includes/class.cooked-import.php:120 #: includes/class.cooked-migration.php:58 msgid "It is definitely recommended that you get yourself a cup of coffee or tea after clicking this button." msgstr "" -#: includes/class.cooked-import.php:63 -#: includes/class.cooked-import.php:118 -#: includes/class.cooked-import.php:170 +#: includes/class.cooked-import.php:67 +#: includes/class.cooked-import.php:122 +#: includes/class.cooked-import.php:174 #: includes/class.cooked-migration.php:60 msgid "Note:" msgstr "" -#: includes/class.cooked-import.php:63 -#: includes/class.cooked-import.php:118 +#: includes/class.cooked-import.php:67 +#: includes/class.cooked-import.php:122 #: includes/class.cooked-migration.php:60 msgid "The more recipes you have, the longer this will take." msgstr "" -#: includes/class.cooked-import.php:68 -#: includes/class.cooked-import.php:83 +#: includes/class.cooked-import.php:72 +#: includes/class.cooked-import.php:87 msgid "WP Delicious - Import" msgstr "" -#: includes/class.cooked-import.php:185 +#: includes/class.cooked-import.php:189 msgid "More Imports are Coming Soon..." msgstr "" -#: includes/class.cooked-import.php:206 +#: includes/class.cooked-import.php:210 msgid "Begin Import" msgstr "" -#: includes/class.cooked-import.php:211 -#: includes/class.cooked-import.php:234 -#: includes/class.cooked-settings.php:729 +#: includes/class.cooked-import.php:215 +#: includes/class.cooked-import.php:238 +#: includes/class.cooked-settings.php:741 msgid "reload" msgstr "" @@ -343,6 +343,7 @@ msgstr "" #: includes/class.cooked-measurements.php:45 #: includes/class.cooked-measurements.php:46 +#: includes/class.cooked-measurements.php:215 msgid "mg" msgstr "" @@ -354,7 +355,7 @@ msgstr "" msgid "milligrams" msgstr "" -#: includes/class.cooked-measurements.php:471 +#: includes/class.cooked-measurements.php:216 msgid "mcg" msgstr "" @@ -587,218 +588,218 @@ msgstr "" msgid "cans" msgstr "" -#: includes/class.cooked-measurements.php:217 -#: includes/class.cooked-recipes.php:1003 -#: includes/class.cooked-settings.php:332 +#: includes/class.cooked-measurements.php:221 +#: includes/class.cooked-recipes.php:1008 +#: includes/class.cooked-settings.php:344 msgid "Servings" msgstr "" -#: includes/class.cooked-measurements.php:221 +#: includes/class.cooked-measurements.php:225 msgid "Serving size" msgstr "" -#: includes/class.cooked-measurements.php:228 +#: includes/class.cooked-measurements.php:232 msgid "Calories" msgstr "" -#: includes/class.cooked-measurements.php:235 +#: includes/class.cooked-measurements.php:239 msgid "Total Fat" msgstr "" -#: includes/class.cooked-measurements.php:241 +#: includes/class.cooked-measurements.php:245 msgid "Saturated Fat" msgstr "" -#: includes/class.cooked-measurements.php:247 +#: includes/class.cooked-measurements.php:251 msgid "Trans Fat" msgstr "" -#: includes/class.cooked-measurements.php:248 +#: includes/class.cooked-measurements.php:252 msgid "Trans Fat" msgstr "" -#: includes/class.cooked-measurements.php:253 +#: includes/class.cooked-measurements.php:257 msgid "Monounsaturated Fat" msgstr "" -#: includes/class.cooked-measurements.php:258 +#: includes/class.cooked-measurements.php:262 msgid "Polyunsaturated Fat" msgstr "" -#: includes/class.cooked-measurements.php:265 +#: includes/class.cooked-measurements.php:269 msgid "Cholesterol" msgstr "" -#: includes/class.cooked-measurements.php:271 +#: includes/class.cooked-measurements.php:275 msgid "Sodium" msgstr "" -#: includes/class.cooked-measurements.php:277 +#: includes/class.cooked-measurements.php:281 msgid "Total Carbohydrate" msgstr "" -#: includes/class.cooked-measurements.php:277 +#: includes/class.cooked-measurements.php:281 msgid "Net Carbohydrate" msgstr "" -#: includes/class.cooked-measurements.php:283 +#: includes/class.cooked-measurements.php:287 msgid "Dietary Fiber" msgstr "" -#: includes/class.cooked-measurements.php:289 +#: includes/class.cooked-measurements.php:293 msgid "Total Sugars" msgstr "" -#: includes/class.cooked-measurements.php:295 +#: includes/class.cooked-measurements.php:299 msgid "Added Sugars" msgstr "" -#: includes/class.cooked-measurements.php:303 +#: includes/class.cooked-measurements.php:307 msgid "Protein" msgstr "" -#: includes/class.cooked-measurements.php:312 +#: includes/class.cooked-measurements.php:316 msgid "Vitamin A" msgstr "" -#: includes/class.cooked-measurements.php:318 +#: includes/class.cooked-measurements.php:322 msgid "Vitamin C" msgstr "" -#: includes/class.cooked-measurements.php:324 +#: includes/class.cooked-measurements.php:328 msgid "Calcium" msgstr "" -#: includes/class.cooked-measurements.php:330 +#: includes/class.cooked-measurements.php:334 msgid "Iron" msgstr "" -#: includes/class.cooked-measurements.php:336 +#: includes/class.cooked-measurements.php:340 msgid "Potassium" msgstr "" -#: includes/class.cooked-measurements.php:342 +#: includes/class.cooked-measurements.php:346 msgid "Vitamin D" msgstr "" -#: includes/class.cooked-measurements.php:348 +#: includes/class.cooked-measurements.php:352 msgid "Vitamin E" msgstr "" -#: includes/class.cooked-measurements.php:354 +#: includes/class.cooked-measurements.php:358 msgid "Vitamin K" msgstr "" -#: includes/class.cooked-measurements.php:360 +#: includes/class.cooked-measurements.php:364 msgid "Thiamin" msgstr "" -#: includes/class.cooked-measurements.php:366 +#: includes/class.cooked-measurements.php:370 msgid "Riboflavin" msgstr "" -#: includes/class.cooked-measurements.php:372 +#: includes/class.cooked-measurements.php:376 msgid "Niacin" msgstr "" -#: includes/class.cooked-measurements.php:378 +#: includes/class.cooked-measurements.php:382 msgid "Vitamin B6" msgstr "" -#: includes/class.cooked-measurements.php:384 +#: includes/class.cooked-measurements.php:388 msgid "Folate" msgstr "" -#: includes/class.cooked-measurements.php:390 +#: includes/class.cooked-measurements.php:394 msgid "Vitamin B12" msgstr "" -#: includes/class.cooked-measurements.php:396 +#: includes/class.cooked-measurements.php:400 msgid "Biotin" msgstr "" -#: includes/class.cooked-measurements.php:402 +#: includes/class.cooked-measurements.php:406 msgid "Pantothenic Acid" msgstr "" -#: includes/class.cooked-measurements.php:408 +#: includes/class.cooked-measurements.php:412 msgid "Phosphorus" msgstr "" -#: includes/class.cooked-measurements.php:414 +#: includes/class.cooked-measurements.php:418 msgid "Iodine" msgstr "" -#: includes/class.cooked-measurements.php:420 +#: includes/class.cooked-measurements.php:424 msgid "Magnesium" msgstr "" -#: includes/class.cooked-measurements.php:426 +#: includes/class.cooked-measurements.php:430 msgid "Zinc" msgstr "" -#: includes/class.cooked-measurements.php:432 +#: includes/class.cooked-measurements.php:436 msgid "Selenium" msgstr "" -#: includes/class.cooked-measurements.php:438 +#: includes/class.cooked-measurements.php:442 msgid "Copper" msgstr "" -#: includes/class.cooked-measurements.php:444 +#: includes/class.cooked-measurements.php:448 msgid "Manganese" msgstr "" -#: includes/class.cooked-measurements.php:450 +#: includes/class.cooked-measurements.php:454 msgid "Chromium" msgstr "" -#: includes/class.cooked-measurements.php:456 +#: includes/class.cooked-measurements.php:460 msgid "Molybdenum" msgstr "" -#: includes/class.cooked-measurements.php:462 +#: includes/class.cooked-measurements.php:466 msgid "Chloride" msgstr "" #. translators: singular and plural number of minutes (shorthand) -#: includes/class.cooked-measurements.php:721 -#: includes/class.cooked-measurements.php:732 -#: includes/class.cooked-measurements.php:750 +#: includes/class.cooked-measurements.php:722 +#: includes/class.cooked-measurements.php:733 +#: includes/class.cooked-measurements.php:751 #, php-format msgid "%d min" msgstr "" #. translators: singular and plural number of minutes (shorthand) -#: includes/class.cooked-measurements.php:721 -#: includes/class.cooked-measurements.php:732 -#: includes/class.cooked-measurements.php:750 +#: includes/class.cooked-measurements.php:722 +#: includes/class.cooked-measurements.php:733 +#: includes/class.cooked-measurements.php:751 #, php-format msgid "%d mins" msgstr "" #. translators: singular and plural number of hours (shorthand) -#: includes/class.cooked-measurements.php:730 -#: includes/class.cooked-measurements.php:748 +#: includes/class.cooked-measurements.php:731 +#: includes/class.cooked-measurements.php:749 #, php-format msgid "%d hr" msgstr "" #. translators: singular and plural number of hours (shorthand) -#: includes/class.cooked-measurements.php:730 -#: includes/class.cooked-measurements.php:748 +#: includes/class.cooked-measurements.php:731 +#: includes/class.cooked-measurements.php:749 #, php-format msgid "%d hrs" msgstr "" #. translators: singular and plural number of days -#: includes/class.cooked-measurements.php:746 +#: includes/class.cooked-measurements.php:747 #, php-format msgid "%d day" msgstr "" #. translators: singular and plural number of days -#: includes/class.cooked-measurements.php:746 +#: includes/class.cooked-measurements.php:747 #, php-format msgid "%d days" msgstr "" @@ -856,52 +857,52 @@ msgstr "" msgid "Required by Cooked Pro" msgstr "" -#: includes/class.cooked-post-types.php:89 +#: includes/class.cooked-post-types.php:90 msgid "Photo" msgstr "" -#: includes/class.cooked-post-types.php:433 -#: includes/class.cooked-settings.php:253 +#: includes/class.cooked-post-types.php:449 +#: includes/class.cooked-settings.php:265 msgid "Recipe Archive" msgstr "" -#: includes/class.cooked-post-types.php:452 +#: includes/class.cooked-post-types.php:469 msgid "Recipe" msgstr "" -#: includes/class.cooked-post-types.php:454 +#: includes/class.cooked-post-types.php:471 msgid "Add New Recipe" msgstr "" -#: includes/class.cooked-post-types.php:455 +#: includes/class.cooked-post-types.php:472 msgid "New Recipe" msgstr "" -#: includes/class.cooked-post-types.php:456 +#: includes/class.cooked-post-types.php:473 msgid "Edit Recipe" msgstr "" -#: includes/class.cooked-post-types.php:457 +#: includes/class.cooked-post-types.php:474 msgid "View Recipe" msgstr "" -#: includes/class.cooked-post-types.php:459 +#: includes/class.cooked-post-types.php:476 msgid "Search Recipes" msgstr "" -#: includes/class.cooked-post-types.php:460 +#: includes/class.cooked-post-types.php:477 msgid "No recipes found." msgstr "" -#: includes/class.cooked-post-types.php:461 +#: includes/class.cooked-post-types.php:478 msgid "No recipes found in trash." msgstr "" -#: includes/class.cooked-post-types.php:489 +#: includes/class.cooked-post-types.php:506 msgid "Recipe title ..." msgstr "" -#: includes/class.cooked-post-types.php:520 +#: includes/class.cooked-post-types.php:537 msgid "Cooked Browse Recipes Page" msgstr "" @@ -914,495 +915,495 @@ msgstr "" msgid "Current recipe category being viewed." msgstr "" -#: includes/class.cooked-recipe-meta.php:288 +#: includes/class.cooked-recipe-meta.php:301 msgid "Display Recipe" msgstr "" -#: includes/class.cooked-recipe-meta.php:289 +#: includes/class.cooked-recipe-meta.php:302 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:409 +#: includes/class.cooked-recipe-meta.php:422 msgid "Layout" msgstr "" -#: includes/class.cooked-recipe-meta.php:433 -#: includes/class.cooked-recipe-meta.php:1459 +#: includes/class.cooked-recipe-meta.php:446 +#: includes/class.cooked-recipe-meta.php:1472 msgid "Gallery" msgstr "" -#: includes/class.cooked-recipe-meta.php:439 +#: includes/class.cooked-recipe-meta.php:452 msgid "Shortcodes" msgstr "" -#: includes/class.cooked-recipe-meta.php:496 +#: includes/class.cooked-recipe-meta.php:509 msgid "Recipe Review Required" msgstr "" #. translators: for displaying singular or plural versions depending on the number of recipes. -#: includes/class.cooked-recipe-meta.php:499 +#: includes/class.cooked-recipe-meta.php:512 #, 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:507 +#: includes/class.cooked-recipe-meta.php:520 msgid "Recipe Shortcode" msgstr "" -#: includes/class.cooked-recipe-meta.php:508 +#: includes/class.cooked-recipe-meta.php:521 msgid "You can use the following shortcode to display your recipe anywhere:" msgstr "" -#: includes/class.cooked-recipe-meta.php:522 +#: includes/class.cooked-recipe-meta.php:535 msgid "Recipe Template" msgstr "" -#: includes/class.cooked-recipe-meta.php:522 +#: includes/class.cooked-recipe-meta.php:535 msgid "Default Recipe Template" msgstr "" -#: includes/class.cooked-recipe-meta.php:522 +#: includes/class.cooked-recipe-meta.php:535 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:522 +#: includes/class.cooked-recipe-meta.php:535 msgid "Save as Default" msgstr "" -#: includes/class.cooked-recipe-meta.php:522 +#: includes/class.cooked-recipe-meta.php:535 msgid "Apply to All" msgstr "" -#: includes/class.cooked-recipe-meta.php:522 +#: includes/class.cooked-recipe-meta.php:535 msgid "Reset" msgstr "" -#: includes/class.cooked-recipe-meta.php:522 +#: includes/class.cooked-recipe-meta.php:535 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:540 +#: includes/class.cooked-recipe-meta.php:553 msgid "Recipe Excerpt" msgstr "" -#: includes/class.cooked-recipe-meta.php:540 +#: includes/class.cooked-recipe-meta.php:553 msgid "The excerpt is used on recipe listing templates, where the full recipe should not be displayed." msgstr "" -#: includes/class.cooked-recipe-meta.php:563 +#: includes/class.cooked-recipe-meta.php:576 msgid "SEO Description" msgstr "" -#: includes/class.cooked-recipe-meta.php:563 +#: includes/class.cooked-recipe-meta.php:576 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:574 -#: includes/class.cooked-settings.php:326 +#: includes/class.cooked-recipe-meta.php:587 +#: includes/class.cooked-settings.php:338 msgid "Difficulty Level" msgstr "" -#: includes/class.cooked-recipe-meta.php:583 -#: includes/class.cooked-recipe-meta.php:1321 -#: includes/class.cooked-settings.php:329 -#: includes/class.cooked-shortcodes.php:509 -#: includes/class.cooked-shortcodes.php:732 +#: includes/class.cooked-recipe-meta.php:596 +#: includes/class.cooked-recipe-meta.php:1334 +#: includes/class.cooked-settings.php:341 +#: includes/class.cooked-shortcodes.php:513 +#: includes/class.cooked-shortcodes.php:736 msgid "Prep Time" msgstr "" -#: includes/class.cooked-recipe-meta.php:585 -#: includes/class.cooked-recipe-meta.php:590 -#: includes/class.cooked-recipe-meta.php:595 +#: includes/class.cooked-recipe-meta.php:598 +#: includes/class.cooked-recipe-meta.php:603 +#: includes/class.cooked-recipe-meta.php:608 msgid "minutes" msgstr "" -#: includes/class.cooked-recipe-meta.php:588 -#: includes/class.cooked-recipe-meta.php:1322 -#: includes/class.cooked-settings.php:330 -#: includes/class.cooked-shortcodes.php:510 -#: includes/class.cooked-shortcodes.php:741 +#: includes/class.cooked-recipe-meta.php:601 +#: includes/class.cooked-recipe-meta.php:1335 +#: includes/class.cooked-settings.php:342 +#: includes/class.cooked-shortcodes.php:514 +#: includes/class.cooked-shortcodes.php:745 msgid "Cook Time" msgstr "" -#: includes/class.cooked-recipe-meta.php:593 -#: includes/class.cooked-recipe-meta.php:1323 -#: includes/class.cooked-settings.php:331 -#: includes/class.cooked-shortcodes.php:511 -#: includes/class.cooked-shortcodes.php:752 -#: includes/class.cooked-shortcodes.php:759 +#: includes/class.cooked-recipe-meta.php:606 +#: includes/class.cooked-recipe-meta.php:1336 +#: includes/class.cooked-settings.php:343 +#: includes/class.cooked-shortcodes.php:515 +#: includes/class.cooked-shortcodes.php:756 +#: includes/class.cooked-shortcodes.php:763 msgid "Total Time" msgstr "" -#: includes/class.cooked-recipe-meta.php:601 +#: includes/class.cooked-recipe-meta.php:614 msgid "Recipe Notes" msgstr "" -#: includes/class.cooked-recipe-meta.php:601 +#: includes/class.cooked-recipe-meta.php:614 msgid "The notes are displayed in the recipe." msgstr "" -#: includes/class.cooked-admin-enqueues.php:181 -#: includes/class.cooked-recipe-meta.php:626 +#: includes/class.cooked-admin-enqueues.php:184 +#: includes/class.cooked-recipe-meta.php:639 msgid "Amount" msgstr "" -#: includes/class.cooked-admin-enqueues.php:182 -#: includes/class.cooked-recipe-meta.php:627 +#: includes/class.cooked-admin-enqueues.php:185 +#: includes/class.cooked-recipe-meta.php:640 msgid "Measurement" msgstr "" -#: includes/class.cooked-admin-enqueues.php:183 -#: includes/class.cooked-recipe-meta.php:628 +#: includes/class.cooked-admin-enqueues.php:186 +#: includes/class.cooked-recipe-meta.php:641 msgid "Item" msgstr "" -#: includes/class.cooked-recipe-meta.php:666 -#: includes/class.cooked-recipe-meta.php:758 -#: includes/class.cooked-recipe-meta.php:825 +#: includes/class.cooked-recipe-meta.php:679 +#: includes/class.cooked-recipe-meta.php:771 +#: includes/class.cooked-recipe-meta.php:838 msgid "ex. Eggs, Milk, etc." msgstr "" -#: includes/class.cooked-recipe-meta.php:699 -#: includes/class.cooked-recipe-meta.php:855 -#: includes/class.cooked-recipe-meta.php:939 -#: includes/class.cooked-recipe-meta.php:1050 +#: includes/class.cooked-recipe-meta.php:712 +#: includes/class.cooked-recipe-meta.php:868 +#: includes/class.cooked-recipe-meta.php:952 +#: includes/class.cooked-recipe-meta.php:1063 msgid "Section Heading" msgstr "" -#: includes/class.cooked-recipe-meta.php:794 +#: includes/class.cooked-recipe-meta.php:807 msgid "Add Ingredient" msgstr "" -#: includes/class.cooked-recipe-meta.php:795 -#: includes/class.cooked-recipe-meta.php:1019 +#: includes/class.cooked-recipe-meta.php:808 +#: includes/class.cooked-recipe-meta.php:1032 msgid "Add Section Heading" msgstr "" -#: includes/class.cooked-recipe-meta.php:1018 +#: includes/class.cooked-recipe-meta.php:1031 msgid "Add Direction" msgstr "" -#: includes/class.cooked-recipe-meta.php:1085 +#: includes/class.cooked-recipe-meta.php:1098 msgid "Nutrition Information" msgstr "" -#: includes/class.cooked-recipe-meta.php:1123 -#: includes/class.cooked-shortcodes.php:1123 +#: includes/class.cooked-recipe-meta.php:1136 +#: includes/class.cooked-shortcodes.php:1127 msgid "Nutrition Facts" msgstr "" -#: includes/class.cooked-recipe-meta.php:1141 -#: includes/class.cooked-shortcodes.php:1091 +#: includes/class.cooked-recipe-meta.php:1154 +#: includes/class.cooked-shortcodes.php:1095 msgid "Amount per serving" msgstr "" -#: includes/class.cooked-recipe-meta.php:1151 -#: includes/class.cooked-shortcodes.php:1101 +#: includes/class.cooked-recipe-meta.php:1164 +#: includes/class.cooked-shortcodes.php:1105 msgid "% Daily Value *" msgstr "" -#: includes/class.cooked-recipe-meta.php:1170 -#: includes/class.cooked-shortcodes.php:1033 +#: includes/class.cooked-recipe-meta.php:1183 +#: includes/class.cooked-shortcodes.php:1037 msgid "Includes" msgstr "" -#: includes/class.cooked-recipe-meta.php:1202 -#: includes/class.cooked-shortcodes.php:1127 +#: includes/class.cooked-recipe-meta.php:1215 +#: includes/class.cooked-shortcodes.php:1131 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:1218 +#: includes/class.cooked-recipe-meta.php:1231 msgid "Recipe Gallery Type" msgstr "" -#: includes/class.cooked-recipe-meta.php:1231 +#: includes/class.cooked-recipe-meta.php:1244 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:1245 +#: includes/class.cooked-recipe-meta.php:1258 #, 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:1249 +#: includes/class.cooked-recipe-meta.php:1262 #, 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:1254 +#: includes/class.cooked-recipe-meta.php:1267 msgid "Gallery Items" msgstr "" -#: includes/class.cooked-recipe-meta.php:1285 +#: includes/class.cooked-recipe-meta.php:1298 msgid "Recipe Information" msgstr "" -#: includes/class.cooked-recipe-meta.php:1286 +#: includes/class.cooked-recipe-meta.php:1299 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:1295 -#: includes/class.cooked-recipe-meta.php:1305 +#: includes/class.cooked-recipe-meta.php:1308 +#: includes/class.cooked-recipe-meta.php:1318 #, php-format msgid "\"%1$s\" and \"%2$s\"" msgstr "" -#: includes/class.cooked-recipe-meta.php:1297 +#: includes/class.cooked-recipe-meta.php:1310 msgid "This will allow you to include or exclude content from the shortcode output." msgstr "" -#: includes/class.cooked-recipe-meta.php:1306 +#: includes/class.cooked-recipe-meta.php:1319 msgid "Used like \"include\", but will position the content to the left or right." msgstr "" -#: includes/class.cooked-recipe-meta.php:361 -#: includes/class.cooked-recipe-meta.php:1316 -#: includes/class.cooked-recipe-meta.php:1362 -#: includes/class.cooked-recipe-meta.php:1393 -#: includes/class.cooked-recipe-meta.php:1418 -#: includes/class.cooked-recipe-meta.php:1442 -#: includes/class.cooked-recipe-meta.php:1502 -#: includes/class.cooked-recipe-meta.php:1547 -#: includes/class.cooked-recipe-meta.php:1577 -#: includes/class.cooked-recipe-meta.php:1622 -#: includes/class.cooked-recipe-meta.php:1745 +#: includes/class.cooked-recipe-meta.php:374 +#: includes/class.cooked-recipe-meta.php:1329 +#: includes/class.cooked-recipe-meta.php:1375 +#: includes/class.cooked-recipe-meta.php:1406 +#: includes/class.cooked-recipe-meta.php:1431 +#: includes/class.cooked-recipe-meta.php:1455 +#: includes/class.cooked-recipe-meta.php:1515 +#: includes/class.cooked-recipe-meta.php:1560 +#: includes/class.cooked-recipe-meta.php:1590 +#: includes/class.cooked-recipe-meta.php:1635 +#: includes/class.cooked-recipe-meta.php:1758 msgid "Available Variables" msgstr "" -#: includes/class.cooked-recipe-meta.php:1320 -#: includes/class.cooked-settings.php:324 -#: includes/class.cooked-shortcodes.php:506 -#: includes/class.cooked-shortcodes.php:684 +#: includes/class.cooked-recipe-meta.php:1333 +#: includes/class.cooked-settings.php:336 +#: includes/class.cooked-shortcodes.php:510 +#: includes/class.cooked-shortcodes.php:688 msgid "Author" msgstr "" -#: includes/class.cooked-recipe-meta.php:1324 -#: includes/class.cooked-shortcodes.php:507 -#: includes/class.cooked-shortcodes.php:695 +#: includes/class.cooked-recipe-meta.php:1337 +#: includes/class.cooked-shortcodes.php:511 +#: includes/class.cooked-shortcodes.php:699 msgid "Difficulty" msgstr "" -#: includes/class.cooked-recipe-meta.php:1325 +#: includes/class.cooked-recipe-meta.php:1338 msgid "Servings Switcher" msgstr "" -#: includes/class.cooked-recipe-meta.php:1326 -#: includes/class.cooked-settings.php:325 -#: includes/class.cooked-shortcodes.php:779 -#: includes/class.cooked-shortcodes.php:782 +#: includes/class.cooked-recipe-meta.php:1339 +#: includes/class.cooked-settings.php:337 +#: includes/class.cooked-shortcodes.php:783 +#: includes/class.cooked-shortcodes.php:786 #: includes/class.cooked-taxonomies.php:39 msgid "Category" msgstr "" -#: includes/class.cooked-recipe-meta.php:1327 +#: includes/class.cooked-recipe-meta.php:1340 msgid "Print Mode" msgstr "" -#: includes/class.cooked-recipe-meta.php:1328 +#: includes/class.cooked-recipe-meta.php:1341 msgid "Full-Screen Mode" msgstr "" -#: includes/class.cooked-recipe-meta.php:1348 +#: includes/class.cooked-recipe-meta.php:1361 msgid "This will display the list of ingredients, added via the \"Ingredients\" tab." msgstr "" -#: includes/class.cooked-recipe-meta.php:1354 +#: includes/class.cooked-recipe-meta.php:1367 msgid "This will allow you to hide or show the checkboxes:" msgstr "" -#: includes/class.cooked-recipe-meta.php:1364 +#: includes/class.cooked-recipe-meta.php:1377 msgid "Show checkboxes" msgstr "" -#: includes/class.cooked-recipe-meta.php:1365 +#: includes/class.cooked-recipe-meta.php:1378 msgid "Hide checkboxes" msgstr "" -#: includes/class.cooked-recipe-meta.php:1379 +#: includes/class.cooked-recipe-meta.php:1392 msgid "This will display the list of directions, added via the \"Directions\" tab." msgstr "" -#: includes/class.cooked-recipe-meta.php:1385 +#: includes/class.cooked-recipe-meta.php:1398 msgid "This will allow you to hide or show the numbers:" msgstr "" -#: includes/class.cooked-recipe-meta.php:1395 +#: includes/class.cooked-recipe-meta.php:1408 msgid "Show numbers" msgstr "" -#: includes/class.cooked-recipe-meta.php:1396 +#: includes/class.cooked-recipe-meta.php:1409 msgid "Hide numbers" msgstr "" -#: includes/class.cooked-recipe-meta.php:1409 +#: includes/class.cooked-recipe-meta.php:1422 msgid "Featured Image" msgstr "" -#: includes/class.cooked-recipe-meta.php:1410 +#: includes/class.cooked-recipe-meta.php:1423 msgid "This will display the featured image, if one is set." msgstr "" -#: includes/class.cooked-recipe-meta.php:1420 -#: includes/class.cooked-recipe-meta.php:1444 -#: includes/class.cooked-recipe-meta.php:1549 +#: includes/class.cooked-recipe-meta.php:1433 +#: includes/class.cooked-recipe-meta.php:1457 +#: includes/class.cooked-recipe-meta.php:1562 msgid "None" msgstr "" -#: includes/class.cooked-recipe-meta.php:1433 +#: includes/class.cooked-recipe-meta.php:1446 msgid "Nutrition Label" msgstr "" -#: includes/class.cooked-recipe-meta.php:1434 +#: includes/class.cooked-recipe-meta.php:1447 msgid "This will display the Nutrition Facts label, if data is present." msgstr "" -#: includes/class.cooked-recipe-meta.php:1460 +#: includes/class.cooked-recipe-meta.php:1473 msgid "This will display the gallery, if one is set or created from the \"Gallery\" tab." msgstr "" -#: includes/class.cooked-recipe-meta.php:1468 +#: includes/class.cooked-recipe-meta.php:1481 msgid "Set the width of the gallery." msgstr "" -#: includes/class.cooked-recipe-meta.php:1475 +#: includes/class.cooked-recipe-meta.php:1488 msgid "Set the image size ratio." msgstr "" -#: includes/class.cooked-recipe-meta.php:1485 +#: includes/class.cooked-recipe-meta.php:1498 msgid "Set the navigation style." msgstr "" -#: includes/class.cooked-recipe-meta.php:1492 +#: includes/class.cooked-recipe-meta.php:1505 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:1507 +#: includes/class.cooked-recipe-meta.php:1520 #, 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:1512 +#: includes/class.cooked-recipe-meta.php:1525 #, 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:1517 +#: includes/class.cooked-recipe-meta.php:1530 #, 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:1522 +#: includes/class.cooked-recipe-meta.php:1535 #, php-format msgid "\"%1$s\" or \"%2$s\"" msgstr "" -#: includes/class.cooked-recipe-meta.php:1539 +#: includes/class.cooked-recipe-meta.php:1552 msgid "This will display the excerpt, if one is available from the \"Layout & Content\" tab." msgstr "" -#: includes/class.cooked-recipe-meta.php:1563 +#: includes/class.cooked-recipe-meta.php:1576 msgid "This will display the notes, if one is available from the \"Layout & Content\" tab." msgstr "" -#: includes/class.cooked-recipe-meta.php:1569 +#: includes/class.cooked-recipe-meta.php:1582 msgid "This will allow you to hide or show the header for the notes section:" msgstr "" -#: includes/class.cooked-recipe-meta.php:1579 +#: includes/class.cooked-recipe-meta.php:1592 msgid "Show header" msgstr "" -#: includes/class.cooked-recipe-meta.php:1580 +#: includes/class.cooked-recipe-meta.php:1593 msgid "Hide header" msgstr "" -#: includes/class.cooked-recipe-meta.php:1594 +#: includes/class.cooked-recipe-meta.php:1607 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:1603 +#: includes/class.cooked-recipe-meta.php:1616 #, php-format msgid "\"%1$s\", \"%2$s\" and \"%3$s\"" msgstr "" -#: includes/class.cooked-recipe-meta.php:1605 +#: includes/class.cooked-recipe-meta.php:1618 msgid "Use just one or a combination of all three to set the timer length" msgstr "" -#: includes/class.cooked-recipe-meta.php:1612 +#: includes/class.cooked-recipe-meta.php:1625 msgid "Add a short description for this timer, if applicable." msgstr "" -#: includes/class.cooked-recipe-meta.php:1624 +#: includes/class.cooked-recipe-meta.php:1637 msgid "Time in seconds" msgstr "" -#: includes/class.cooked-recipe-meta.php:1625 +#: includes/class.cooked-recipe-meta.php:1638 msgid "Time in minutes" msgstr "" -#: includes/class.cooked-recipe-meta.php:1626 +#: includes/class.cooked-recipe-meta.php:1639 msgid "Time in hours" msgstr "" -#: includes/class.cooked-recipe-meta.php:1627 +#: includes/class.cooked-recipe-meta.php:1640 msgid "Timer Description" msgstr "" #. translators: stating the recipe author with a "By" in front of it. (ex: "By John Smith") #. translators: referring to the author (ex: By John Smith) -#: includes/class.cooked-recipes.php:298 -#: includes/class.cooked-recipes.php:352 +#: includes/class.cooked-recipes.php:300 +#: includes/class.cooked-recipes.php:354 #: templates/front/recipe-single.php:47 #, php-format msgid "By %s" msgstr "" #. translators: For showing "All" of a taxonomy (ex: "All Burgers") -#: includes/class.cooked-recipes.php:445 +#: includes/class.cooked-recipes.php:449 #, php-format msgid "All %s" msgstr "" -#: includes/class.cooked-recipes.php:829 +#: includes/class.cooked-recipes.php:833 msgid "Beginner" msgstr "" -#: includes/class.cooked-recipes.php:830 +#: includes/class.cooked-recipes.php:834 msgid "Intermediate" msgstr "" -#: includes/class.cooked-recipes.php:831 +#: includes/class.cooked-recipes.php:835 msgid "Advanced" msgstr "" -#: includes/class.cooked-recipes.php:857 +#: includes/class.cooked-recipes.php:861 msgid "Cooked Gallery" msgstr "" -#: includes/class.cooked-recipes.php:861 +#: includes/class.cooked-recipes.php:865 msgid "Envira Gallery" msgstr "" -#: includes/class.cooked-recipes.php:865 +#: includes/class.cooked-recipes.php:869 msgid "Soliloquy Slider" msgstr "" -#: includes/class.cooked-recipes.php:869 +#: includes/class.cooked-recipes.php:873 msgid "Slider Revolution" msgstr "" #. translators: singular and plural quarter "serving" size -#: includes/class.cooked-recipes.php:970 +#: includes/class.cooked-recipes.php:975 #, php-format msgid "Quarter (%s Serving)" msgid_plural "Quarter (%s Servings)" @@ -1410,7 +1411,7 @@ msgstr[0] "" msgstr[1] "" #. translators: singular and plural quarter "serving" size -#: includes/class.cooked-recipes.php:973 +#: includes/class.cooked-recipes.php:978 #, php-format msgid "Half (%s Serving)" msgid_plural "Half (%s Servings)" @@ -1418,7 +1419,7 @@ msgstr[0] "" msgstr[1] "" #. translators: singular and plural quarter "serving" size -#: includes/class.cooked-recipes.php:976 +#: includes/class.cooked-recipes.php:981 #, php-format msgid "Default (%s Serving)" msgid_plural "Default (%s Servings)" @@ -1426,25 +1427,25 @@ msgstr[0] "" msgstr[1] "" #. translators: singular and plural quarter "serving" size -#: includes/class.cooked-recipes.php:979 +#: includes/class.cooked-recipes.php:984 #, php-format msgid "Double (%s Servings)" msgstr "" #. translators: singular and plural quarter "serving" size -#: includes/class.cooked-recipes.php:982 +#: includes/class.cooked-recipes.php:987 #, php-format msgid "Triple (%s Servings)" msgstr "" -#: includes/class.cooked-recipes.php:996 -#: includes/class.cooked-shortcodes.php:508 +#: includes/class.cooked-recipes.php:1001 +#: includes/class.cooked-shortcodes.php:512 msgid "Yields" msgstr "" #. translators: singular and plural "serving" sizes -#: includes/class.cooked-recipes.php:1000 -#: includes/class.cooked-recipes.php:1011 +#: includes/class.cooked-recipes.php:1005 +#: includes/class.cooked-recipes.php:1016 #, php-format msgid "%s Serving" msgid_plural "%s Servings" @@ -1452,51 +1453,52 @@ msgstr[0] "" msgstr[1] "" #. translators: singular and plural "steps" -#: includes/class.cooked-recipes.php:1202 -#: includes/class.cooked-seo.php:83 +#. translators: %d: step number +#: includes/class.cooked-recipes.php:1207 +#: includes/class.cooked-seo.php:84 #, php-format msgid "Step %d" msgstr "" -#: includes/class.cooked-recipes.php:1262 +#: includes/class.cooked-recipes.php:1267 msgid "Browse" msgstr "" -#: includes/class.cooked-recipes.php:1280 -#: includes/class.cooked-settings.php:251 +#: includes/class.cooked-recipes.php:1285 +#: includes/class.cooked-settings.php:263 msgid "No categories" msgstr "" -#: includes/class.cooked-recipes.php:1283 -#: includes/class.cooked-settings.php:300 +#: includes/class.cooked-recipes.php:1288 +#: includes/class.cooked-settings.php:312 #: includes/class.cooked-taxonomies.php:38 #: includes/class.cooked-taxonomies.php:48 msgid "Categories" msgstr "" -#: includes/class.cooked-recipes.php:1285 +#: includes/class.cooked-recipes.php:1290 #: includes/class.cooked-taxonomies.php:41 #: includes/widgets/recipe-categories.php:63 msgid "All Categories" msgstr "" -#: includes/class.cooked-recipes.php:1356 +#: includes/class.cooked-recipes.php:1361 msgid "Find a recipe..." msgstr "" -#: includes/class.cooked-recipes.php:1371 +#: includes/class.cooked-recipes.php:1376 msgid "Newest first" msgstr "" -#: includes/class.cooked-recipes.php:1375 +#: includes/class.cooked-recipes.php:1380 msgid "Oldest first" msgstr "" -#: includes/class.cooked-recipes.php:1379 +#: includes/class.cooked-recipes.php:1384 msgid "Alphabetical (A-Z)" msgstr "" -#: includes/class.cooked-recipes.php:1383 +#: includes/class.cooked-recipes.php:1388 msgid "Alphabetical (Z-A)" msgstr "" @@ -1504,311 +1506,311 @@ msgstr "" msgid "Recipe Editor" msgstr "" -#: includes/class.cooked-settings.php:110 +#: includes/class.cooked-settings.php:119 msgid "Cooked settings has been updated!" msgstr "" -#: includes/class.cooked-settings.php:251 +#: includes/class.cooked-settings.php:263 msgid "No default" msgstr "" -#: includes/class.cooked-settings.php:273 +#: includes/class.cooked-settings.php:285 msgid "General" msgstr "" -#: includes/class.cooked-settings.php:131 -#: includes/class.cooked-settings.php:277 +#: includes/class.cooked-settings.php:143 +#: includes/class.cooked-settings.php:289 msgid "Browse/Search Recipes Page" msgstr "" #. translators: a description on how to add the [cooked-browse] shortcode to a page -#: includes/class.cooked-settings.php:279 +#: includes/class.cooked-settings.php:291 #, php-format msgid "Create a page with the %s shortcode on it, then choose it from this dropdown." msgstr "" -#: includes/class.cooked-settings.php:285 +#: includes/class.cooked-settings.php:297 msgid "Recipes Per Page" msgstr "" #. translators: a description on how to choose the default number of recipes per page. -#: includes/class.cooked-settings.php:287 +#: includes/class.cooked-settings.php:299 #, php-format msgid "Choose the default (set via the %s panel) or choose a different number here." msgstr "" #. translators: a description on how to choose the default number of recipes per page. -#: includes/class.cooked-settings.php:287 +#: includes/class.cooked-settings.php:299 msgid "Settings > Reading" msgstr "" -#: includes/class.cooked-settings.php:293 +#: includes/class.cooked-settings.php:305 msgid "Recipe Taxonomies" msgstr "" -#: includes/class.cooked-settings.php:294 +#: includes/class.cooked-settings.php:306 msgid "Choose which taxonomies you want to enable for your recipes." msgstr "" -#: includes/class.cooked-settings.php:305 +#: includes/class.cooked-settings.php:317 msgid "Global Recipe Toggles" msgstr "" -#: includes/class.cooked-settings.php:306 +#: includes/class.cooked-settings.php:318 msgid "You can quickly hide or show different recipe elements (site-wide) with these checkboxes." msgstr "" -#: includes/class.cooked-settings.php:349 +#: includes/class.cooked-settings.php:361 msgid "Carbs Format" msgstr "" -#: includes/class.cooked-settings.php:350 +#: includes/class.cooked-settings.php:362 msgid "You can display carbs as \"Total\" or \"Net\"." msgstr "" -#: includes/class.cooked-settings.php:356 +#: includes/class.cooked-settings.php:368 msgid "Total Carbs" msgstr "" -#: includes/class.cooked-settings.php:357 +#: includes/class.cooked-settings.php:369 msgid "Net Carbs" msgstr "" -#: includes/class.cooked-settings.php:362 +#: includes/class.cooked-settings.php:374 msgid "Author Name Format" msgstr "" -#: includes/class.cooked-settings.php:363 +#: includes/class.cooked-settings.php:375 msgid "You can show the full author's name or just a part of it." msgstr "" -#: includes/class.cooked-settings.php:369 +#: includes/class.cooked-settings.php:381 msgid "Full name" msgstr "" -#: includes/class.cooked-settings.php:370 +#: includes/class.cooked-settings.php:382 msgid "Full first name w/last name initial" msgstr "" -#: includes/class.cooked-settings.php:371 +#: includes/class.cooked-settings.php:383 msgid "First name initial w/full last name" msgstr "" -#: includes/class.cooked-settings.php:372 +#: includes/class.cooked-settings.php:384 msgid "First name only" msgstr "" -#: includes/class.cooked-settings.php:377 +#: includes/class.cooked-settings.php:389 msgid "Author Links" msgstr "" -#: includes/class.cooked-settings.php:378 +#: includes/class.cooked-settings.php:390 msgid "If you do not want the author names to link to the author recipe listings, you can disable them here." msgstr "" -#: includes/class.cooked-settings.php:385 +#: includes/class.cooked-settings.php:397 msgid "Disable Author Links" msgstr "" -#: includes/class.cooked-settings.php:390 +#: includes/class.cooked-settings.php:402 msgid "Default Category" msgstr "" #. translators: a description on how to set the default recipe category for the [cooked-browse] shortcode. -#: includes/class.cooked-settings.php:392 +#: includes/class.cooked-settings.php:404 #, php-format msgid "Optionally set the default recipe category for your %s shortcode display." msgstr "" -#: includes/class.cooked-settings.php:398 +#: includes/class.cooked-settings.php:410 msgid "Default Sort Order" msgstr "" #. translators: a description on how to set the default sort order for the [cooked-browse] shortcode. -#: includes/class.cooked-settings.php:400 +#: includes/class.cooked-settings.php:412 #, php-format msgid "Set the default sort order for your %s shortcode display." msgstr "" -#: includes/class.cooked-settings.php:406 +#: includes/class.cooked-settings.php:418 msgid "Newest First" msgstr "" -#: includes/class.cooked-settings.php:407 +#: includes/class.cooked-settings.php:419 msgid "Oldest First" msgstr "" -#: includes/class.cooked-settings.php:408 +#: includes/class.cooked-settings.php:420 msgid "Alphabetical" msgstr "" -#: includes/class.cooked-settings.php:409 +#: includes/class.cooked-settings.php:421 msgid "Alphabetical (reversed)" msgstr "" -#: includes/class.cooked-settings.php:432 +#: includes/class.cooked-settings.php:444 msgid "WP Editor Roles" msgstr "" -#: includes/class.cooked-settings.php:433 +#: includes/class.cooked-settings.php:445 msgid "Choose which user roles can use the WP Editor for the Excerpt, Directions & Notes fields." msgstr "" -#: includes/class.cooked-settings.php:439 +#: includes/class.cooked-settings.php:451 msgid "Advanced Settings" msgstr "" #. translators: an option to only show recipes with the [cooked-recipe] shortcode. -#: includes/class.cooked-settings.php:449 +#: includes/class.cooked-settings.php:461 msgid "Disable Public Recipes" msgstr "" #. translators: an option to only show recipes with the [cooked-recipe] shortcode. -#: includes/class.cooked-settings.php:449 +#: includes/class.cooked-settings.php:461 #, php-format msgid "Only show recipes using the %s shortcode." msgstr "" #. translators: an option to disable "meta" tags. -#: includes/class.cooked-settings.php:451 +#: includes/class.cooked-settings.php:463 #, php-format msgid "Disable %s Tags" msgstr "" #. translators: an option to disable "meta" tags. -#: includes/class.cooked-settings.php:451 +#: includes/class.cooked-settings.php:463 msgid "Prevents duplicates when tags already exist." msgstr "" -#: includes/class.cooked-settings.php:452 +#: includes/class.cooked-settings.php:464 msgid "Disable \"Servings Switcher\"" msgstr "" -#: includes/class.cooked-settings.php:452 +#: includes/class.cooked-settings.php:464 msgid "Removes the servings dropdown on recipes." msgstr "" -#: includes/class.cooked-settings.php:454 +#: includes/class.cooked-settings.php:466 msgid "Disable Recipe Schema Output" msgstr "" -#: includes/class.cooked-settings.php:454 +#: includes/class.cooked-settings.php:466 msgid "You should only do this if you're using something else to output schema information." msgstr "" -#: includes/class.cooked-settings.php:455 +#: includes/class.cooked-settings.php:467 msgid "Disable Recipe Archive Page" msgstr "" -#: includes/class.cooked-settings.php:466 +#: includes/class.cooked-settings.php:478 msgid "Design" msgstr "" -#: includes/class.cooked-settings.php:470 +#: includes/class.cooked-settings.php:482 msgid "Dark Mode" msgstr "" -#: includes/class.cooked-settings.php:487 +#: includes/class.cooked-settings.php:499 msgid "Author Images" msgstr "" -#: includes/class.cooked-settings.php:488 +#: includes/class.cooked-settings.php:500 msgid "If you do not want to display the author images (avatars), you can disable them here." msgstr "" -#: includes/class.cooked-settings.php:495 +#: includes/class.cooked-settings.php:507 msgid "Hide Author Images" msgstr "" -#: includes/class.cooked-settings.php:506 +#: includes/class.cooked-settings.php:518 msgid "Main Color" msgstr "" -#: includes/class.cooked-settings.php:507 +#: includes/class.cooked-settings.php:519 msgid "Used on buttons, cooking timer, etc." msgstr "" -#: includes/class.cooked-settings.php:513 +#: includes/class.cooked-settings.php:525 msgid "Main Color (on hover)" msgstr "" -#: includes/class.cooked-settings.php:514 +#: includes/class.cooked-settings.php:526 msgid "Used when hovering over buttons." msgstr "" -#: includes/class.cooked-settings.php:520 +#: includes/class.cooked-settings.php:532 msgid "First Responsive Breakpoint" msgstr "" -#: includes/class.cooked-settings.php:521 +#: includes/class.cooked-settings.php:533 msgid "Set the first responsive breakpoint. Best for large tablets." msgstr "" -#: includes/class.cooked-settings.php:527 +#: includes/class.cooked-settings.php:539 msgid "Second Responsive Breakpoint" msgstr "" -#: includes/class.cooked-settings.php:528 +#: includes/class.cooked-settings.php:540 msgid "Set the second responsive breakpoint. Best for small tablets." msgstr "" -#: includes/class.cooked-settings.php:534 +#: includes/class.cooked-settings.php:546 msgid "Third Responsive Breakpoint" msgstr "" -#: includes/class.cooked-settings.php:535 +#: includes/class.cooked-settings.php:547 msgid "Set the third responsive breakpoint. Best for phones and other small devices." msgstr "" -#: includes/class.cooked-settings.php:543 +#: includes/class.cooked-settings.php:555 msgid "Permalinks" msgstr "" -#: includes/class.cooked-settings.php:547 +#: includes/class.cooked-settings.php:559 msgid "Recipe Permalink" msgstr "" -#: includes/class.cooked-settings.php:550 +#: includes/class.cooked-settings.php:562 msgid "recipe-name" msgstr "" -#: includes/class.cooked-settings.php:554 +#: includes/class.cooked-settings.php:566 msgid "Recipe Author Permalink" msgstr "" -#: includes/class.cooked-settings.php:557 +#: includes/class.cooked-settings.php:569 msgid "author-name" msgstr "" -#: includes/class.cooked-settings.php:561 +#: includes/class.cooked-settings.php:573 msgid "Recipe Category Permalink" msgstr "" -#: includes/class.cooked-settings.php:564 +#: includes/class.cooked-settings.php:576 msgid "recipe-category-name" msgstr "" #. translators: posts_per_page default -#: includes/class.cooked-settings.php:575 +#: includes/class.cooked-settings.php:587 #, php-format msgid "WordPress Default %s" msgstr "" -#: includes/class.cooked-settings.php:580 +#: includes/class.cooked-settings.php:592 msgid "Show All (no pagination)" msgstr "" -#: includes/class.cooked-settings.php:724 +#: includes/class.cooked-settings.php:736 msgid "Begin Migration" msgstr "" #. translators: referring to the bottom of the Settings page. -#: includes/class.cooked-shortcodes.php:167 +#: includes/class.cooked-shortcodes.php:168 #, php-format msgid "Public recipes are currently disabled. You can change this at the bottom of the %s page." msgstr "" -#: includes/class.cooked-shortcodes.php:328 +#: includes/class.cooked-shortcodes.php:331 msgid "(recipe not found or in draft status)" msgstr "" @@ -2060,7 +2062,7 @@ msgstr "" msgid "Update Settings" msgstr "" -#: includes/class.cooked-recipe-meta.php:118 +#: includes/class.cooked-recipe-meta.php:124 #: templates/admin/settings.php:10 #: templates/admin/welcome.php:33 msgid "Cooked Settings" @@ -2072,6 +2074,7 @@ msgstr "" msgid "Thanks for using %s!" msgstr "" +#. translators: 1: plugin name, 2: Settings link, 3: documentation link, 4: Discord link #: templates/admin/welcome.php:16 #, php-format msgid "If this is your first time using %1$s, head over to the %2$s page for some initial configuration. You can also check out the %3$s if you get stuck or contact me on %4$s. If you just recently updated, you can find out what's new below." @@ -2108,10 +2111,10 @@ msgstr "" msgid "View all recipes" msgstr "" -#: includes/class.cooked-recipe-meta.php:703 -#: includes/class.cooked-recipe-meta.php:859 -#: includes/class.cooked-recipe-meta.php:943 -#: includes/class.cooked-recipe-meta.php:1054 +#: includes/class.cooked-recipe-meta.php:716 +#: includes/class.cooked-recipe-meta.php:872 +#: includes/class.cooked-recipe-meta.php:956 +#: includes/class.cooked-recipe-meta.php:1067 msgid "Heading Element:" msgstr "" @@ -2128,52 +2131,52 @@ msgstr "" msgid "deciliters" msgstr "" -#: includes/class.cooked-settings.php:414 +#: includes/class.cooked-settings.php:426 msgid "Section Heading Default HTML Tag" msgstr "" #. translators: a description on how to set the default sort order for the [cooked-browse] shortcode. -#: includes/class.cooked-settings.php:416 +#: includes/class.cooked-settings.php:428 msgid "Set the default HTML tag for your section headings." msgstr "" -#: includes/class.cooked-settings.php:422 +#: includes/class.cooked-settings.php:434 msgid "div" msgstr "" -#: includes/class.cooked-settings.php:423 +#: includes/class.cooked-settings.php:435 msgid "h2" msgstr "" -#: includes/class.cooked-settings.php:424 +#: includes/class.cooked-settings.php:436 msgid "h3" msgstr "" -#: includes/class.cooked-settings.php:425 +#: includes/class.cooked-settings.php:437 msgid "h4" msgstr "" -#: includes/class.cooked-settings.php:426 +#: includes/class.cooked-settings.php:438 msgid "h5" msgstr "" -#: includes/class.cooked-settings.php:427 +#: includes/class.cooked-settings.php:439 msgid "h6" msgstr "" -#: includes/class.cooked-recipes.php:1358 +#: includes/class.cooked-recipes.php:1363 msgid "Search" msgstr "" -#: includes/class.cooked-shortcodes.php:723 +#: includes/class.cooked-shortcodes.php:727 msgid "Fullscreen" msgstr "" -#: includes/class.cooked-settings.php:250 +#: includes/class.cooked-settings.php:262 msgid "Choose a page..." msgstr "" -#: includes/class.cooked-settings.php:250 +#: includes/class.cooked-settings.php:262 msgid "No pages" msgstr "" @@ -2181,16 +2184,16 @@ msgstr "" msgid "Error importing WP Delicious recipe." msgstr "" -#: includes/class.cooked-import.php:108 +#: includes/class.cooked-import.php:112 msgid "The difficulty level will be set to Beginner since it is not supported by WP Recipe Maker." msgstr "" -#: includes/class.cooked-import.php:110 +#: includes/class.cooked-import.php:114 msgid "The existing WP Recipe Maker and data will not be modified or deleted." msgstr "" -#: includes/class.cooked-import.php:123 -#: includes/class.cooked-import.php:138 +#: includes/class.cooked-import.php:127 +#: includes/class.cooked-import.php:142 msgid "WP Recipe Maker - Import" msgstr "" @@ -2198,189 +2201,192 @@ msgstr "" msgid "Error importing WP Recipe Maker recipe." msgstr "" -#: includes/class.cooked-settings.php:129 +#: includes/class.cooked-settings.php:140 msgid "Cooked Plugin Setup" msgstr "" -#: includes/class.cooked-settings.php:130 +#. translators: %s: Browse/Search Recipes Page link +#: includes/class.cooked-settings.php:142 #, php-format msgid "To display your recipes properly, please set up your %s." msgstr "" #. translators: a description on how to add the [cooked-browse] shortcode to a page -#: includes/class.cooked-settings.php:279 +#: includes/class.cooked-settings.php:291 msgid "Note: This setting is required for the plugin to function properly." msgstr "" -#: includes/class.cooked-settings.php:378 +#: includes/class.cooked-settings.php:390 msgid "Note: Author links require the Browse/Search Recipes Page to be set up correctly to function properly." msgstr "" -#: includes/class.cooked-recipe-meta.php:675 -#: includes/class.cooked-recipe-meta.php:767 -#: includes/class.cooked-recipe-meta.php:834 -msgid "Substitution:" -msgstr "" - #: includes/class.cooked-recipe-meta.php:688 #: includes/class.cooked-recipe-meta.php:780 #: includes/class.cooked-recipe-meta.php:847 +msgid "Substitution:" +msgstr "" + +#: includes/class.cooked-recipe-meta.php:701 +#: includes/class.cooked-recipe-meta.php:793 +#: includes/class.cooked-recipe-meta.php:860 msgid "ex. Apple Sauce, Tofu, etc." msgstr "" -#: includes/class.cooked-recipes.php:1143 -#: includes/class.cooked-recipes.php:1157 +#: includes/class.cooked-recipes.php:1148 +#: includes/class.cooked-recipes.php:1162 msgid "or" msgstr "" -#: includes/class.cooked-recipe-meta.php:1640 +#: includes/class.cooked-recipe-meta.php:1653 msgid "Next & Previous Recipe Navigation" msgstr "" -#: includes/class.cooked-recipe-meta.php:1641 +#: includes/class.cooked-recipe-meta.php:1654 msgid "This will display navigation links to the next and previous recipes." msgstr "" -#: includes/class.cooked-recipe-meta.php:1645 +#: includes/class.cooked-recipe-meta.php:1658 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:1650 +#: includes/class.cooked-recipe-meta.php:1663 msgid "Usage" msgstr "" -#: includes/class.cooked-recipe-meta.php:1652 +#: includes/class.cooked-recipe-meta.php:1665 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:1665 +#: includes/class.cooked-recipe-meta.php:1678 #: includes/class.cooked-related-recipes.php:34 msgid "Related Recipes" msgstr "" -#: includes/class.cooked-shortcodes.php:1192 +#: includes/class.cooked-shortcodes.php:1196 msgid "Recipe not found." msgstr "" -#: includes/class.cooked-shortcodes.php:1207 +#: includes/class.cooked-shortcodes.php:1213 msgid "No related recipes found." msgstr "" -#: includes/class.cooked-multilingual.php:260 +#: includes/class.cooked-multilingual.php:262 msgid "Multilingual Setup:" msgstr "" -#: includes/class.cooked-multilingual.php:261 +#: includes/class.cooked-multilingual.php:263 msgid "Your Browse/Search Recipes page is missing translations for:" msgstr "" #. translators: %s is the multilingual plugin name (Polylang or WPML) -#: includes/class.cooked-multilingual.php:266 +#: includes/class.cooked-multilingual.php:268 #, php-format msgid "Create translations of your browse page in %s for full multilingual support." msgstr "" -#: includes/class.cooked-recipe-meta.php:1674 +#: includes/class.cooked-recipe-meta.php:1687 msgid "Specify a recipe ID. If not provided, uses the current recipe." msgstr "" -#: includes/class.cooked-recipe-meta.php:1681 +#: includes/class.cooked-recipe-meta.php:1694 msgid "Set the heading text for the related recipes section." msgstr "" -#: includes/class.cooked-recipe-meta.php:1708 +#: includes/class.cooked-recipe-meta.php:1721 msgid "Hide recipe card images." msgstr "" -#: includes/class.cooked-recipe-meta.php:1715 +#: includes/class.cooked-recipe-meta.php:1728 msgid "Hide recipe card excerpts." msgstr "" -#: includes/class.cooked-recipe-meta.php:1725 +#: includes/class.cooked-recipe-meta.php:1738 msgid "Hide recipe card authors." msgstr "" -#: includes/class.cooked-recipe-meta.php:363 -#: includes/class.cooked-recipe-meta.php:1747 +#: includes/class.cooked-recipe-meta.php:376 +#: includes/class.cooked-recipe-meta.php:1760 msgid "Recipe ID" msgstr "" -#: includes/class.cooked-admin-enqueues.php:177 -#: includes/class.cooked-recipe-meta.php:1748 +#: includes/class.cooked-admin-enqueues.php:180 +#: includes/class.cooked-recipe-meta.php:1761 msgid "Section heading" msgstr "" -#: includes/class.cooked-recipe-meta.php:1749 +#: includes/class.cooked-recipe-meta.php:1762 msgid "Number of recipes" msgstr "" -#: includes/class.cooked-recipe-meta.php:1750 +#: includes/class.cooked-recipe-meta.php:1763 msgid "Grid columns" msgstr "" -#: includes/class.cooked-recipe-meta.php:366 -#: includes/class.cooked-recipe-meta.php:367 -#: includes/class.cooked-recipe-meta.php:368 -#: includes/class.cooked-recipe-meta.php:369 -#: includes/class.cooked-recipe-meta.php:1751 -#: includes/class.cooked-recipe-meta.php:1752 -#: includes/class.cooked-recipe-meta.php:1753 -#: includes/class.cooked-recipe-meta.php:1754 +#: includes/class.cooked-recipe-meta.php:379 +#: includes/class.cooked-recipe-meta.php:380 +#: includes/class.cooked-recipe-meta.php:381 +#: includes/class.cooked-recipe-meta.php:382 +#: includes/class.cooked-recipe-meta.php:1764 +#: includes/class.cooked-recipe-meta.php:1765 +#: includes/class.cooked-recipe-meta.php:1766 +#: includes/class.cooked-recipe-meta.php:1767 msgid "true/false" msgstr "" -#: includes/class.cooked-recipe-meta.php:371 -#: includes/class.cooked-recipe-meta.php:1756 +#: includes/class.cooked-recipe-meta.php:384 +#: includes/class.cooked-recipe-meta.php:1769 msgid "Example" msgstr "" -#: includes/class.cooked-shortcodes.php:1175 +#: includes/class.cooked-shortcodes.php:1179 msgid "Invalid recipe ID specified. Please provide a valid numeric recipe ID." msgstr "" -#: includes/class.cooked-shortcodes.php:1185 +#: includes/class.cooked-shortcodes.php:1189 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:1196 +#. translators: %d: post ID +#: includes/class.cooked-shortcodes.php:1201 #, php-format msgid "The specified ID (%d) is not a recipe." msgstr "" -#: includes/class.cooked-shortcodes.php:1198 +#. translators: %d: post ID +#: includes/class.cooked-shortcodes.php:1204 #, php-format msgid "No post found with ID %d." msgstr "" -#: includes/class.cooked-shortcodes.php:1210 +#: includes/class.cooked-shortcodes.php:1216 msgid "This may be because there are no other recipes in the current language with matching attributes." msgstr "" -#: includes/class.cooked-shortcodes.php:1212 +#: includes/class.cooked-shortcodes.php:1218 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:1666 +#: includes/class.cooked-recipe-meta.php:1679 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:1691 +#: includes/class.cooked-recipe-meta.php:1704 msgid "Number of recipes to display (default: 4)." msgstr "" -#: includes/class.cooked-recipe-meta.php:1698 +#: includes/class.cooked-recipe-meta.php:1711 msgid "Number of columns in the grid (default: 2)." msgstr "" -#: includes/class.cooked-recipe-meta.php:1732 +#: includes/class.cooked-recipe-meta.php:1745 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:1739 +#: includes/class.cooked-recipe-meta.php:1752 msgid "Matching options:" msgstr "" -#: includes/class.cooked-recipe-meta.php:1740 +#: includes/class.cooked-recipe-meta.php:1753 msgid "Set to false to exclude a taxonomy from related recipes, e.g. match_cuisines=\"false\" to ignore cuisines." msgstr "" @@ -2396,48 +2402,50 @@ msgstr "" msgid "No tools available." msgstr "" -#: includes/class.cooked-updates.php:150 +#: includes/class.cooked-updates.php:167 msgid "Flush rewrite rules" msgstr "" -#: includes/class.cooked-updates.php:151 +#: includes/class.cooked-updates.php:168 msgid "Refreshes permalink rules for recipe and profile URLs." msgstr "" -#: includes/class.cooked-updates.php:154 +#: includes/class.cooked-updates.php:171 msgid "Fix recipe line endings" msgstr "" -#: includes/class.cooked-updates.php:155 +#: includes/class.cooked-updates.php:172 msgid "Normalizes line endings in recipe content for exporter/importer compatibility." msgstr "" -#: includes/class.cooked-updates.php:158 +#: includes/class.cooked-updates.php:175 msgid "Purge legacy related recipes cache" msgstr "" -#: includes/class.cooked-updates.php:159 +#: includes/class.cooked-updates.php:176 msgid "Removes old transients and options from the previous related-recipes cache." msgstr "" -#: includes/class.cooked-updates.php:162 +#: includes/class.cooked-updates.php:179 msgid "Remove recipes from user meta" msgstr "" -#: includes/class.cooked-updates.php:163 +#: includes/class.cooked-updates.php:180 msgid "Removes the legacy \"recipes\" key from all users' cooked_user_meta." msgstr "" -#: includes/class.cooked-updates.php:196 +#: includes/class.cooked-updates.php:213 msgid "Tool name is required." msgstr "" -#: includes/class.cooked-updates.php:207 +#. translators: %s: site health tool name +#: includes/class.cooked-updates.php:225 #, php-format msgid "Unknown tool: %s." msgstr "" -#: includes/class.cooked-updates.php:210 +#. translators: %s: PHP method name +#: includes/class.cooked-updates.php:229 #, php-format msgid "Tool method %s does not exist." msgstr "" @@ -2483,7 +2491,8 @@ msgid "Failed to upload CSV file." msgstr "" #: includes/class.cooked-admin-enqueues.php:164 -#: includes/class.cooked-ajax.php:398 +#: includes/class.cooked-ajax.php:405 +#: includes/class.cooked-ajax.php:410 msgid "File upload failed." msgstr "" @@ -2509,30 +2518,31 @@ msgstr "" msgid "Last: %1$s · %2$s recipes" msgstr "" -#: includes/class.cooked-ajax.php:316 -#: includes/class.cooked-ajax.php:365 +#: includes/class.cooked-ajax.php:321 +#: includes/class.cooked-ajax.php:371 msgid "No default content provided." msgstr "" -#: includes/class.cooked-ajax.php:394 -#: includes/class.cooked-ajax.php:430 +#: includes/class.cooked-ajax.php:401 +#: includes/class.cooked-ajax.php:444 msgid "You do not have permission to import recipes." msgstr "" -#: includes/class.cooked-ajax.php:404 +#: includes/class.cooked-ajax.php:417 msgid "Invalid file type. Please upload a CSV file." msgstr "" -#: includes/class.cooked-ajax.php:437 +#: includes/class.cooked-ajax.php:451 msgid "CSV file not found. Please upload again." msgstr "" -#: includes/class.cooked-ajax.php:453 +#. translators: %d: number of recipes imported +#: includes/class.cooked-ajax.php:468 #, php-format msgid "Successfully imported %d recipe(s)." msgstr "" -#: includes/class.cooked-ajax.php:462 +#: includes/class.cooked-ajax.php:477 msgid "No recipes were imported." msgstr "" @@ -2552,91 +2562,91 @@ msgstr "" msgid "CSV file must contain a \"title\" column." msgstr "" -#: includes/class.cooked-import.php:152 +#: includes/class.cooked-import.php:156 msgid "Import recipes from a CSV file. Your CSV file should include the following columns:" msgstr "" -#: includes/class.cooked-import.php:154 +#: includes/class.cooked-import.php:158 msgid "Recipe title (required)" msgstr "" -#: includes/class.cooked-import.php:156 +#: includes/class.cooked-import.php:160 msgid "Prep time in minutes" msgstr "" -#: includes/class.cooked-import.php:157 +#: includes/class.cooked-import.php:161 msgid "Cook time in minutes" msgstr "" -#: includes/class.cooked-import.php:158 +#: includes/class.cooked-import.php:162 msgid "Difficulty level (1=Beginner, 2=Intermediate, 3=Advanced)" msgstr "" -#: includes/class.cooked-import.php:165 +#: includes/class.cooked-import.php:169 msgid "Cooking method, separated by comma" msgstr "" -#: includes/class.cooked-import.php:170 +#: includes/class.cooked-import.php:174 msgid "Recipes will be imported with the 'Draft' status. After the import is complete, you can bulk edit the recipes and change their status to 'Published'." msgstr "" -#: includes/class.cooked-import.php:173 +#: includes/class.cooked-import.php:177 msgid "CSV Import" msgstr "" -#: includes/class.cooked-import.php:177 +#: includes/class.cooked-import.php:181 msgid "Import Recipes via CSV" msgstr "" -#: includes/class.cooked-import.php:229 +#: includes/class.cooked-import.php:233 msgid "Upload and Import CSV" msgstr "" -#: includes/class.cooked-import.php:234 +#: includes/class.cooked-import.php:238 msgid "Import Complete!" msgstr "" -#: includes/class.cooked-import.php:234 +#: includes/class.cooked-import.php:238 msgid "You can now" msgstr "" -#: includes/class.cooked-import.php:234 +#: includes/class.cooked-import.php:238 msgid "the import screen or" msgstr "" -#: includes/class.cooked-import.php:234 +#: includes/class.cooked-import.php:238 msgid "view your recipes" msgstr "" -#: includes/class.cooked-import.php:155 +#: includes/class.cooked-import.php:159 msgid "Excerpt/description" msgstr "" -#: includes/class.cooked-import.php:162 +#: includes/class.cooked-import.php:166 msgid "Category, separated by comma" msgstr "" -#: includes/class.cooked-import.php:164 +#: includes/class.cooked-import.php:168 msgid "Cuisine, separated by comma" msgstr "" -#: includes/class.cooked-import.php:166 +#: includes/class.cooked-import.php:170 msgid "Tags, separated by comma" msgstr "" -#: includes/class.cooked-import.php:167 +#: includes/class.cooked-import.php:171 msgid "Restricted diet type (Schema.org RestrictedDiet), separated by comma" msgstr "" -#: includes/class.cooked-admin-enqueues.php:173 +#: includes/class.cooked-admin-enqueues.php:176 msgid "Bulk Add Ingredients" msgstr "" -#: includes/class.cooked-admin-enqueues.php:174 +#: includes/class.cooked-admin-enqueues.php:177 msgid "Bulk Add Directions" msgstr "" -#: includes/class.cooked-admin-enqueues.php:175 +#: includes/class.cooked-admin-enqueues.php:178 msgid "" "2 cups flour\n" "1 tsp salt\n" @@ -2644,55 +2654,55 @@ msgid "" "3 large eggs" msgstr "" -#: includes/class.cooked-admin-enqueues.php:176 +#: includes/class.cooked-admin-enqueues.php:179 msgid "" "Preheat oven to 350°F.\n" "Mix dry ingredients together.\n" "Add wet ingredients and stir." msgstr "" -#: includes/class.cooked-admin-enqueues.php:178 +#: includes/class.cooked-admin-enqueues.php:181 msgid "Parsing..." msgstr "" -#: includes/class.cooked-admin-enqueues.php:179 +#: includes/class.cooked-admin-enqueues.php:182 msgid "Add Ingredients" msgstr "" -#: includes/class.cooked-admin-enqueues.php:180 +#: includes/class.cooked-admin-enqueues.php:183 msgid "Add Directions" msgstr "" -#: includes/class.cooked-admin-enqueues.php:184 +#: includes/class.cooked-admin-enqueues.php:187 msgid "Heading text" msgstr "" -#: includes/class.cooked-ajax.php:470 +#: includes/class.cooked-ajax.php:486 msgid "Security check failed." msgstr "" -#: includes/class.cooked-ajax.php:476 +#: includes/class.cooked-ajax.php:492 msgid "No ingredients provided." msgstr "" -#: includes/class.cooked-recipe-meta.php:258 +#: includes/class.cooked-recipe-meta.php:271 msgid "Enter one item per line. Use the checkboxes below to mark section headings." msgstr "" -#: includes/class.cooked-recipe-meta.php:261 +#: includes/class.cooked-recipe-meta.php:274 msgid "Preview" msgstr "" -#: includes/class.cooked-recipe-meta.php:265 +#: includes/class.cooked-recipe-meta.php:278 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:270 +#: includes/class.cooked-recipe-meta.php:283 msgid "Cancel" msgstr "" -#: includes/class.cooked-recipe-meta.php:797 -#: includes/class.cooked-recipe-meta.php:1021 +#: includes/class.cooked-recipe-meta.php:810 +#: includes/class.cooked-recipe-meta.php:1034 msgid "Bulk Add" msgstr "" @@ -2777,12 +2787,14 @@ msgstr "" msgid "Contains %s" msgstr "" -#: includes/class.cooked-recipe-meta.php:217 +#. translators: %s: recipe embed shortcode +#: includes/class.cooked-recipe-meta.php:229 #, php-format msgid "This recipe is set up to include itself in the Recipe Template (containing shortcode %s), which can break the page. Remove the embed that references this same recipe." msgstr "" -#: includes/class.cooked-shortcodes.php:359 +#. translators: %s: recipe embed shortcode +#: includes/class.cooked-shortcodes.php:363 #, php-format msgid "This recipe could not be displayed because it is set up to include itself (containing shortcode %s). Remove the duplicate recipe embed from the Recipe Template." msgstr "" @@ -2798,133 +2810,134 @@ msgstr "" msgid "Row %1$d: Unknown error" msgstr "" +#. translators: 1: CSV row number, 2: error message #. translators: 1: row number, 2: error message -#: includes/class.cooked-csv-import.php:123 -#: includes/class.cooked-csv-import.php:188 +#: includes/class.cooked-csv-import.php:124 +#: includes/class.cooked-csv-import.php:189 #, php-format msgid "Row %1$d: %2$s" msgstr "" #. translators: %d: row number -#: includes/class.cooked-csv-import.php:156 +#: includes/class.cooked-csv-import.php:157 #, php-format msgid "Row %1$d: Title is required" msgstr "" -#: includes/class.cooked-import.php:159 +#: includes/class.cooked-import.php:163 msgid "Ingredients, separated by pipe (|).
Format: \"amount|measurement|name\" or \"name\" for simple ingredients.
Add substitutions with double pipe (||): \"amount|measurement|name||sub_amount|sub_measurement|sub_name\"" msgstr "" -#: includes/class.cooked-import.php:160 +#: includes/class.cooked-import.php:164 msgid "Directions/instructions, separated by pipe (|)" msgstr "" -#: includes/class.cooked-recipe-meta.php:301 +#: includes/class.cooked-recipe-meta.php:314 msgid "Recipe Card" msgstr "" -#: includes/class.cooked-recipe-meta.php:302 +#: includes/class.cooked-recipe-meta.php:315 msgid "Displays a compact linked recipe card with image, title, author, and excerpt — not the full recipe. Use this to promote this recipe elsewhere on your site." msgstr "" -#: includes/class.cooked-recipe-meta.php:310 +#: includes/class.cooked-recipe-meta.php:323 msgid "Choose \"modern\" or \"modern-centered\"." msgstr "" -#: includes/class.cooked-recipe-meta.php:317 +#: includes/class.cooked-recipe-meta.php:330 msgid "Set the card width. Defaults to 100%. Use \"%\" or \"px\" after the number." msgstr "" -#: includes/class.cooked-recipe-meta.php:327 +#: includes/class.cooked-recipe-meta.php:340 msgid "Hide the recipe excerpt." msgstr "" -#: includes/class.cooked-recipe-meta.php:334 +#: includes/class.cooked-recipe-meta.php:347 msgid "Hide the recipe author." msgstr "" -#: includes/class.cooked-recipe-meta.php:344 +#: includes/class.cooked-recipe-meta.php:357 msgid "Hide the recipe image." msgstr "" -#: includes/class.cooked-recipe-meta.php:351 +#: includes/class.cooked-recipe-meta.php:364 msgid "Hide the recipe title." msgstr "" -#: includes/class.cooked-recipe-meta.php:364 +#: includes/class.cooked-recipe-meta.php:377 msgid "Card width" msgstr "" -#: includes/class.cooked-recipe-meta.php:365 +#: includes/class.cooked-recipe-meta.php:378 msgid "modern, modern-centered" msgstr "" -#: includes/class.cooked-settings.php:337 +#: includes/class.cooked-settings.php:349 msgid "Print View" msgstr "" -#: includes/class.cooked-import.php:220 +#: includes/class.cooked-import.php:224 msgid "Download sample CSV files:" msgstr "" -#: includes/class.cooked-import.php:221 +#: includes/class.cooked-import.php:225 msgid "Small (1 recipe)" msgstr "" -#: includes/class.cooked-import.php:222 +#: includes/class.cooked-import.php:226 msgid "Medium (3 recipes)" msgstr "" -#: includes/class.cooked-import.php:223 +#: includes/class.cooked-import.php:227 msgid "Large (10 recipes)" msgstr "" -#: includes/class.cooked-recipes.php:935 -#: includes/class.cooked-recipes.php:945 +#: includes/class.cooked-recipes.php:939 +#: includes/class.cooked-recipes.php:949 msgid "Default" msgstr "" -#: includes/class.cooked-recipes.php:936 -#: includes/class.cooked-recipes.php:946 +#: includes/class.cooked-recipes.php:940 +#: includes/class.cooked-recipes.php:950 msgid "Metric" msgstr "" -#: includes/class.cooked-recipes.php:937 -#: includes/class.cooked-recipes.php:947 +#: includes/class.cooked-recipes.php:941 +#: includes/class.cooked-recipes.php:951 msgid "Imperial" msgstr "" -#: includes/class.cooked-recipes.php:941 +#: includes/class.cooked-recipes.php:945 msgid "Units" msgstr "" -#: includes/class.cooked-recipes.php:943 +#: includes/class.cooked-recipes.php:947 msgid "Measurement System" msgstr "" -#: includes/class.cooked-settings.php:453 +#: includes/class.cooked-settings.php:465 msgid "Enable \"Measurement System Switcher\"" msgstr "" -#: includes/class.cooked-settings.php:453 +#: includes/class.cooked-settings.php:465 msgid "Shows the Metric/Imperial toggle on recipes." msgstr "" #. translators: %s: recipe archive URL, e.g. https://example.com/recipe-archive -#: includes/class.cooked-settings.php:457 +#: includes/class.cooked-settings.php:469 #, php-format msgid "Prevents the recipe archive from being displayed at %s." msgstr "" #: includes/class.cooked-admin-enqueues.php:141 -#: includes/class.cooked-recipe-meta.php:922 -#: includes/class.cooked-recipe-meta.php:1002 -#: includes/class.cooked-recipe-meta.php:1040 +#: includes/class.cooked-recipe-meta.php:935 +#: includes/class.cooked-recipe-meta.php:1015 +#: includes/class.cooked-recipe-meta.php:1053 msgid "Add Video" msgstr "" #: includes/class.cooked-admin-enqueues.php:142 -#: includes/class.cooked-recipe-meta.php:922 +#: includes/class.cooked-recipe-meta.php:935 msgid "Change Video" msgstr "" @@ -2948,34 +2961,48 @@ msgstr "" msgid "Pixwell's dark mode toggle is enabled. Choose Auto so Cooked follows it when visitors switch themes." msgstr "" -#: includes/class.cooked-settings.php:338 +#: includes/class.cooked-settings.php:350 msgid "When enabled, the website logo will appear at the top of the recipe print screen." msgstr "" -#: includes/class.cooked-settings.php:344 +#: includes/class.cooked-settings.php:356 msgid "Show Website Logo" msgstr "" -#: includes/class.cooked-settings.php:473 +#: includes/class.cooked-settings.php:485 msgid "Use Auto if your theme has a visitor dark mode toggle. Cooked will then match that choice. Otherwise leave this Off." msgstr "" -#: includes/class.cooked-settings.php:480 +#: includes/class.cooked-settings.php:492 msgid "Off" msgstr "" -#: includes/class.cooked-settings.php:481 +#: includes/class.cooked-settings.php:493 msgid "On" msgstr "" -#: includes/class.cooked-settings.php:482 +#: includes/class.cooked-settings.php:494 msgid "Auto (match theme dark mode)" msgstr "" -#: includes/class.cooked-settings.php:500 +#: includes/class.cooked-settings.php:512 msgid "Default Recipe Image" msgstr "" -#: includes/class.cooked-settings.php:501 +#: includes/class.cooked-settings.php:513 msgid "Used as the featured image for recipes that do not have one set." msgstr "" + +#: includes/class.cooked-measurements.php:214 +msgid "g" +msgstr "" + +#: includes/class.cooked-post-types.php:466 +msgctxt "post type general name" +msgid "Recipes" +msgstr "" + +#: includes/class.cooked-post-types.php:467 +msgctxt "post type singular name" +msgid "Recipe" +msgstr "" diff --git a/languages/cooked.pot b/languages/cooked.pot index 7ad0fb9..2992a15 100644 --- a/languages/cooked.pot +++ b/languages/cooked.pot @@ -2,14 +2,14 @@ # This file is distributed under the GPLv2 or later. msgid "" msgstr "" -"Project-Id-Version: Cooked - Recipe Management 1.16.0\n" +"Project-Id-Version: Cooked - Recipe Management 1.16.1\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-08-11T20:41:45-04:00\n" +"POT-Creation-Date: 2026-09-07T16:18:34-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,16 +44,16 @@ msgid "remaining" msgstr "" #: includes/class.cooked-admin-enqueues.php:138 -#: includes/class.cooked-recipe-meta.php:912 -#: includes/class.cooked-recipe-meta.php:979 -#: includes/class.cooked-recipe-meta.php:1030 -#: includes/class.cooked-settings.php:802 +#: includes/class.cooked-recipe-meta.php:925 +#: includes/class.cooked-recipe-meta.php:992 +#: includes/class.cooked-recipe-meta.php:1043 +#: includes/class.cooked-settings.php:814 msgid "Add Image" msgstr "" #: includes/class.cooked-admin-enqueues.php:139 -#: includes/class.cooked-recipe-meta.php:912 -#: includes/class.cooked-settings.php:802 +#: includes/class.cooked-recipe-meta.php:925 +#: includes/class.cooked-settings.php:814 msgid "Change Image" msgstr "" @@ -62,14 +62,14 @@ msgid "Use this Image" msgstr "" #: includes/class.cooked-admin-enqueues.php:141 -#: includes/class.cooked-recipe-meta.php:922 -#: includes/class.cooked-recipe-meta.php:1002 -#: includes/class.cooked-recipe-meta.php:1040 +#: includes/class.cooked-recipe-meta.php:935 +#: includes/class.cooked-recipe-meta.php:1015 +#: includes/class.cooked-recipe-meta.php:1053 msgid "Add Video" msgstr "" #: includes/class.cooked-admin-enqueues.php:142 -#: includes/class.cooked-recipe-meta.php:922 +#: includes/class.cooked-recipe-meta.php:935 msgid "Change Video" msgstr "" @@ -78,7 +78,7 @@ msgid "Use this Video" msgstr "" #: includes/class.cooked-admin-enqueues.php:144 -#: includes/class.cooked-recipe-meta.php:1269 +#: includes/class.cooked-recipe-meta.php:1282 msgid "Add to Gallery" msgstr "" @@ -157,7 +157,8 @@ msgid "Failed to upload CSV file." msgstr "" #: includes/class.cooked-admin-enqueues.php:164 -#: includes/class.cooked-ajax.php:398 +#: includes/class.cooked-ajax.php:405 +#: includes/class.cooked-ajax.php:410 msgid "File upload failed." msgstr "" @@ -183,15 +184,15 @@ msgstr "" msgid "Last: %1$s · %2$s recipes" msgstr "" -#: includes/class.cooked-admin-enqueues.php:173 +#: includes/class.cooked-admin-enqueues.php:176 msgid "Bulk Add Ingredients" msgstr "" -#: includes/class.cooked-admin-enqueues.php:174 +#: includes/class.cooked-admin-enqueues.php:177 msgid "Bulk Add Directions" msgstr "" -#: includes/class.cooked-admin-enqueues.php:175 +#: includes/class.cooked-admin-enqueues.php:178 msgid "" "2 cups flour\n" "1 tsp salt\n" @@ -199,67 +200,67 @@ msgid "" "3 large eggs" msgstr "" -#: includes/class.cooked-admin-enqueues.php:176 +#: includes/class.cooked-admin-enqueues.php:179 msgid "" "Preheat oven to 350°F.\n" "Mix dry ingredients together.\n" "Add wet ingredients and stir." msgstr "" -#: includes/class.cooked-admin-enqueues.php:177 -#: includes/class.cooked-recipe-meta.php:1748 +#: includes/class.cooked-admin-enqueues.php:180 +#: includes/class.cooked-recipe-meta.php:1761 msgid "Section heading" msgstr "" -#: includes/class.cooked-admin-enqueues.php:178 +#: includes/class.cooked-admin-enqueues.php:181 msgid "Parsing..." msgstr "" -#: includes/class.cooked-admin-enqueues.php:179 +#: includes/class.cooked-admin-enqueues.php:182 msgid "Add Ingredients" msgstr "" -#: includes/class.cooked-admin-enqueues.php:180 +#: includes/class.cooked-admin-enqueues.php:183 msgid "Add Directions" msgstr "" -#: includes/class.cooked-admin-enqueues.php:181 -#: includes/class.cooked-recipe-meta.php:626 +#: includes/class.cooked-admin-enqueues.php:184 +#: includes/class.cooked-recipe-meta.php:639 msgid "Amount" msgstr "" -#: includes/class.cooked-admin-enqueues.php:182 -#: includes/class.cooked-recipe-meta.php:627 +#: includes/class.cooked-admin-enqueues.php:185 +#: includes/class.cooked-recipe-meta.php:640 msgid "Measurement" msgstr "" -#: includes/class.cooked-admin-enqueues.php:183 -#: includes/class.cooked-recipe-meta.php:628 +#: includes/class.cooked-admin-enqueues.php:186 +#: includes/class.cooked-recipe-meta.php:641 msgid "Item" msgstr "" -#: includes/class.cooked-admin-enqueues.php:184 +#: includes/class.cooked-admin-enqueues.php:187 msgid "Heading text" msgstr "" #: includes/class.cooked-admin-menus.php:36 #: includes/class.cooked-admin-menus.php:59 -#: includes/class.cooked-post-types.php:451 -#: includes/class.cooked-post-types.php:463 +#: includes/class.cooked-post-types.php:468 +#: includes/class.cooked-post-types.php:480 #: includes/class.cooked-users.php:166 msgid "Recipes" msgstr "" #: includes/class.cooked-admin-menus.php:37 #: includes/class.cooked-admin-menus.php:61 -#: includes/class.cooked-post-types.php:453 +#: includes/class.cooked-post-types.php:470 msgid "Add New" msgstr "" #. translators: referring to the bottom of the Settings page. #: includes/class.cooked-admin-menus.php:45 #: includes/class.cooked-admin-menus.php:65 -#: includes/class.cooked-shortcodes.php:167 +#: includes/class.cooked-shortcodes.php:168 #: templates/admin/welcome.php:18 msgid "Settings" msgstr "" @@ -278,7 +279,7 @@ msgid "Upgrade to Pro" msgstr "" #: includes/class.cooked-admin-menus.php:60 -#: includes/class.cooked-post-types.php:458 +#: includes/class.cooked-post-types.php:475 msgid "All Recipes" msgstr "" @@ -289,60 +290,61 @@ msgstr "" msgid "You do not have sufficient permissions to access this page." msgstr "" -#: includes/class.cooked-ajax.php:187 -#: includes/class.cooked-csv-import.php:392 +#: includes/class.cooked-ajax.php:207 +#: includes/class.cooked-csv-import.php:393 #: includes/class.cooked-functions.php:134 -#: includes/class.cooked-recipe-meta.php:177 -#: includes/class.cooked-recipe-meta.php:415 -#: includes/class.cooked-recipe-meta.php:1347 -#: includes/class.cooked-recipes.php:740 -#: includes/class.cooked-recipes.php:772 +#: includes/class.cooked-recipe-meta.php:187 +#: includes/class.cooked-recipe-meta.php:428 +#: includes/class.cooked-recipe-meta.php:1360 +#: includes/class.cooked-recipes.php:744 +#: includes/class.cooked-recipes.php:776 msgid "Ingredients" msgstr "" -#: includes/class.cooked-ajax.php:187 -#: includes/class.cooked-csv-import.php:392 +#: includes/class.cooked-ajax.php:207 +#: includes/class.cooked-csv-import.php:393 #: includes/class.cooked-functions.php:135 -#: includes/class.cooked-recipe-meta.php:177 -#: includes/class.cooked-recipe-meta.php:421 -#: includes/class.cooked-recipe-meta.php:1378 -#: includes/class.cooked-recipes.php:744 -#: includes/class.cooked-recipes.php:773 +#: includes/class.cooked-recipe-meta.php:187 +#: includes/class.cooked-recipe-meta.php:434 +#: includes/class.cooked-recipe-meta.php:1391 +#: includes/class.cooked-recipes.php:748 +#: includes/class.cooked-recipes.php:777 msgid "Directions" msgstr "" -#: includes/class.cooked-ajax.php:316 -#: includes/class.cooked-ajax.php:365 +#: includes/class.cooked-ajax.php:321 +#: includes/class.cooked-ajax.php:371 msgid "No default content provided." msgstr "" -#: includes/class.cooked-ajax.php:394 -#: includes/class.cooked-ajax.php:430 +#: includes/class.cooked-ajax.php:401 +#: includes/class.cooked-ajax.php:444 msgid "You do not have permission to import recipes." msgstr "" -#: includes/class.cooked-ajax.php:404 +#: includes/class.cooked-ajax.php:417 msgid "Invalid file type. Please upload a CSV file." msgstr "" -#: includes/class.cooked-ajax.php:437 +#: includes/class.cooked-ajax.php:451 msgid "CSV file not found. Please upload again." msgstr "" -#: includes/class.cooked-ajax.php:453 +#. translators: %d: number of recipes imported +#: includes/class.cooked-ajax.php:468 #, php-format msgid "Successfully imported %d recipe(s)." msgstr "" -#: includes/class.cooked-ajax.php:462 +#: includes/class.cooked-ajax.php:477 msgid "No recipes were imported." msgstr "" -#: includes/class.cooked-ajax.php:470 +#: includes/class.cooked-ajax.php:486 msgid "Security check failed." msgstr "" -#: includes/class.cooked-ajax.php:476 +#: includes/class.cooked-ajax.php:492 msgid "No ingredients provided." msgstr "" @@ -461,15 +463,16 @@ msgstr "" msgid "Row %1$d: Unknown error" msgstr "" +#. translators: 1: CSV row number, 2: error message #. translators: 1: row number, 2: error message -#: includes/class.cooked-csv-import.php:123 -#: includes/class.cooked-csv-import.php:188 +#: includes/class.cooked-csv-import.php:124 +#: includes/class.cooked-csv-import.php:189 #, php-format msgid "Row %1$d: %2$s" msgstr "" #. translators: %d: row number -#: includes/class.cooked-csv-import.php:156 +#: includes/class.cooked-csv-import.php:157 #, php-format msgid "Row %1$d: Title is required" msgstr "" @@ -479,7 +482,7 @@ msgid "Error importing WP Delicious recipe." msgstr "" #: includes/class.cooked-enqueues.php:56 -#: includes/class.cooked-recipe-meta.php:1593 +#: includes/class.cooked-recipe-meta.php:1606 msgid "Timer" msgstr "" @@ -490,7 +493,7 @@ msgid "What's new in %s?" msgstr "" #: includes/class.cooked-functions.php:127 -#: includes/class.cooked-shortcodes.php:717 +#: includes/class.cooked-shortcodes.php:721 msgid "Print" msgstr "" @@ -507,8 +510,8 @@ msgid "Information" msgstr "" #: includes/class.cooked-functions.php:132 -#: includes/class.cooked-recipe-meta.php:1538 -#: includes/class.cooked-settings.php:327 +#: includes/class.cooked-recipe-meta.php:1551 +#: includes/class.cooked-settings.php:339 msgid "Excerpt" msgstr "" @@ -517,221 +520,221 @@ msgid "Images" msgstr "" #: includes/class.cooked-functions.php:136 -#: includes/class.cooked-import.php:161 -#: includes/class.cooked-recipe-meta.php:1562 -#: includes/class.cooked-recipes.php:747 -#: includes/class.cooked-settings.php:328 -#: includes/class.cooked-shortcodes.php:836 +#: includes/class.cooked-import.php:165 +#: includes/class.cooked-recipe-meta.php:1575 +#: includes/class.cooked-recipes.php:751 +#: includes/class.cooked-settings.php:340 +#: includes/class.cooked-shortcodes.php:840 msgid "Notes" msgstr "" #: includes/class.cooked-functions.php:137 -#: includes/class.cooked-recipe-meta.php:427 +#: includes/class.cooked-recipe-meta.php:440 msgid "Nutrition" msgstr "" #. translators: for displaying singular or plural versions depending on the number of recipes. -#: includes/class.cooked-import.php:46 -#: includes/class.cooked-import.php:100 +#: includes/class.cooked-import.php:50 +#: includes/class.cooked-import.php:104 #, php-format msgid "There is %1$s recipe that should be imported from %2$s." msgid_plural "There are %1$s recipes that should be imported from %2$s." msgstr[0] "" msgstr[1] "" -#: includes/class.cooked-import.php:48 -#: includes/class.cooked-import.php:102 +#: includes/class.cooked-import.php:52 +#: includes/class.cooked-import.php:106 msgid "Before you begin, please make sure you backup your database in case something goes wrong." msgstr "" -#: includes/class.cooked-import.php:50 -#: includes/class.cooked-import.php:104 +#: includes/class.cooked-import.php:54 +#: includes/class.cooked-import.php:108 msgid "Click the button below to import these recipes. Here is what will happen to your recipes:" msgstr "" -#: includes/class.cooked-import.php:52 -#: includes/class.cooked-import.php:106 +#: includes/class.cooked-import.php:56 +#: includes/class.cooked-import.php:110 msgid "Recipes will be imported with the 'Draft' status." msgstr "" -#: includes/class.cooked-import.php:53 -#: includes/class.cooked-import.php:107 +#: includes/class.cooked-import.php:57 +#: includes/class.cooked-import.php:111 msgid "Comments and ratings data will also be imported (ratings are available in Cooked Pro)." msgstr "" -#: includes/class.cooked-import.php:54 -#: includes/class.cooked-import.php:109 +#: includes/class.cooked-import.php:58 +#: includes/class.cooked-import.php:113 msgid "After the import is complete, you can bulk edit the recipes and change their status to 'Published'." msgstr "" -#: includes/class.cooked-import.php:55 +#: includes/class.cooked-import.php:59 msgid "The existing WP Delicious recipes and data will not be modified or deleted." msgstr "" -#: includes/class.cooked-import.php:56 -#: includes/class.cooked-import.php:111 +#: includes/class.cooked-import.php:60 +#: includes/class.cooked-import.php:115 msgid "Certain data that is not suppoted by Cooked will not be imported (such as Cooking Temp, Estimated Cost, Recipe Keywords, etc)." msgstr "" -#: includes/class.cooked-import.php:57 -#: includes/class.cooked-import.php:112 +#: includes/class.cooked-import.php:61 +#: includes/class.cooked-import.php:116 msgid "You can run the import multiple times, but keep in mind that duplicate recipes will be created." msgstr "" -#: includes/class.cooked-import.php:61 -#: includes/class.cooked-import.php:116 +#: includes/class.cooked-import.php:65 +#: includes/class.cooked-import.php:120 #: includes/class.cooked-migration.php:58 msgid "Wow, you have a lot of recipes!" msgstr "" -#: includes/class.cooked-import.php:61 -#: includes/class.cooked-import.php:116 +#: includes/class.cooked-import.php:65 +#: includes/class.cooked-import.php:120 #: includes/class.cooked-migration.php:58 msgid "It is definitely recommended that you get yourself a cup of coffee or tea after clicking this button." msgstr "" -#: includes/class.cooked-import.php:63 -#: includes/class.cooked-import.php:118 -#: includes/class.cooked-import.php:170 +#: includes/class.cooked-import.php:67 +#: includes/class.cooked-import.php:122 +#: includes/class.cooked-import.php:174 #: includes/class.cooked-migration.php:60 msgid "Note:" msgstr "" -#: includes/class.cooked-import.php:63 -#: includes/class.cooked-import.php:118 +#: includes/class.cooked-import.php:67 +#: includes/class.cooked-import.php:122 #: includes/class.cooked-migration.php:60 msgid "The more recipes you have, the longer this will take." msgstr "" -#: includes/class.cooked-import.php:68 -#: includes/class.cooked-import.php:83 +#: includes/class.cooked-import.php:72 +#: includes/class.cooked-import.php:87 msgid "WP Delicious - Import" msgstr "" -#: includes/class.cooked-import.php:108 +#: includes/class.cooked-import.php:112 msgid "The difficulty level will be set to Beginner since it is not supported by WP Recipe Maker." msgstr "" -#: includes/class.cooked-import.php:110 +#: includes/class.cooked-import.php:114 msgid "The existing WP Recipe Maker and data will not be modified or deleted." msgstr "" -#: includes/class.cooked-import.php:123 -#: includes/class.cooked-import.php:138 +#: includes/class.cooked-import.php:127 +#: includes/class.cooked-import.php:142 msgid "WP Recipe Maker - Import" msgstr "" -#: includes/class.cooked-import.php:152 +#: includes/class.cooked-import.php:156 msgid "Import recipes from a CSV file. Your CSV file should include the following columns:" msgstr "" -#: includes/class.cooked-import.php:154 +#: includes/class.cooked-import.php:158 msgid "Recipe title (required)" msgstr "" -#: includes/class.cooked-import.php:155 +#: includes/class.cooked-import.php:159 msgid "Excerpt/description" msgstr "" -#: includes/class.cooked-import.php:156 +#: includes/class.cooked-import.php:160 msgid "Prep time in minutes" msgstr "" -#: includes/class.cooked-import.php:157 +#: includes/class.cooked-import.php:161 msgid "Cook time in minutes" msgstr "" -#: includes/class.cooked-import.php:158 +#: includes/class.cooked-import.php:162 msgid "Difficulty level (1=Beginner, 2=Intermediate, 3=Advanced)" msgstr "" -#: includes/class.cooked-import.php:159 +#: includes/class.cooked-import.php:163 msgid "Ingredients, separated by pipe (|).
Format: \"amount|measurement|name\" or \"name\" for simple ingredients.
Add substitutions with double pipe (||): \"amount|measurement|name||sub_amount|sub_measurement|sub_name\"" msgstr "" -#: includes/class.cooked-import.php:160 +#: includes/class.cooked-import.php:164 msgid "Directions/instructions, separated by pipe (|)" msgstr "" -#: includes/class.cooked-import.php:162 +#: includes/class.cooked-import.php:166 msgid "Category, separated by comma" msgstr "" -#: includes/class.cooked-import.php:164 +#: includes/class.cooked-import.php:168 msgid "Cuisine, separated by comma" msgstr "" -#: includes/class.cooked-import.php:165 +#: includes/class.cooked-import.php:169 msgid "Cooking method, separated by comma" msgstr "" -#: includes/class.cooked-import.php:166 +#: includes/class.cooked-import.php:170 msgid "Tags, separated by comma" msgstr "" -#: includes/class.cooked-import.php:167 +#: includes/class.cooked-import.php:171 msgid "Restricted diet type (Schema.org RestrictedDiet), separated by comma" msgstr "" -#: includes/class.cooked-import.php:170 +#: includes/class.cooked-import.php:174 msgid "Recipes will be imported with the 'Draft' status. After the import is complete, you can bulk edit the recipes and change their status to 'Published'." msgstr "" -#: includes/class.cooked-import.php:173 +#: includes/class.cooked-import.php:177 msgid "CSV Import" msgstr "" -#: includes/class.cooked-import.php:177 +#: includes/class.cooked-import.php:181 msgid "Import Recipes via CSV" msgstr "" -#: includes/class.cooked-import.php:185 +#: includes/class.cooked-import.php:189 msgid "More Imports are Coming Soon..." msgstr "" -#: includes/class.cooked-import.php:206 +#: includes/class.cooked-import.php:210 msgid "Begin Import" msgstr "" -#: includes/class.cooked-import.php:211 -#: includes/class.cooked-import.php:234 -#: includes/class.cooked-settings.php:729 +#: includes/class.cooked-import.php:215 +#: includes/class.cooked-import.php:238 +#: includes/class.cooked-settings.php:741 msgid "reload" msgstr "" -#: includes/class.cooked-import.php:220 +#: includes/class.cooked-import.php:224 msgid "Download sample CSV files:" msgstr "" -#: includes/class.cooked-import.php:221 +#: includes/class.cooked-import.php:225 msgid "Small (1 recipe)" msgstr "" -#: includes/class.cooked-import.php:222 +#: includes/class.cooked-import.php:226 msgid "Medium (3 recipes)" msgstr "" -#: includes/class.cooked-import.php:223 +#: includes/class.cooked-import.php:227 msgid "Large (10 recipes)" msgstr "" -#: includes/class.cooked-import.php:229 +#: includes/class.cooked-import.php:233 msgid "Upload and Import CSV" msgstr "" -#: includes/class.cooked-import.php:234 +#: includes/class.cooked-import.php:238 msgid "Import Complete!" msgstr "" -#: includes/class.cooked-import.php:234 +#: includes/class.cooked-import.php:238 msgid "You can now" msgstr "" -#: includes/class.cooked-import.php:234 +#: includes/class.cooked-import.php:238 msgid "the import screen or" msgstr "" -#: includes/class.cooked-import.php:234 +#: includes/class.cooked-import.php:238 msgid "view your recipes" msgstr "" @@ -773,6 +776,7 @@ msgstr "" #: includes/class.cooked-measurements.php:45 #: includes/class.cooked-measurements.php:46 +#: includes/class.cooked-measurements.php:215 msgid "mg" msgstr "" @@ -1026,222 +1030,226 @@ msgstr "" msgid "cans" msgstr "" -#: includes/class.cooked-measurements.php:217 -#: includes/class.cooked-recipes.php:1003 -#: includes/class.cooked-settings.php:332 -msgid "Servings" +#: includes/class.cooked-measurements.php:214 +msgid "g" +msgstr "" + +#: includes/class.cooked-measurements.php:216 +msgid "mcg" msgstr "" #: includes/class.cooked-measurements.php:221 +#: includes/class.cooked-recipes.php:1008 +#: includes/class.cooked-settings.php:344 +msgid "Servings" +msgstr "" + +#: includes/class.cooked-measurements.php:225 msgid "Serving size" msgstr "" -#: includes/class.cooked-measurements.php:228 +#: includes/class.cooked-measurements.php:232 msgid "Calories" msgstr "" -#: includes/class.cooked-measurements.php:235 +#: includes/class.cooked-measurements.php:239 msgid "Total Fat" msgstr "" -#: includes/class.cooked-measurements.php:241 +#: includes/class.cooked-measurements.php:245 msgid "Saturated Fat" msgstr "" -#: includes/class.cooked-measurements.php:247 +#: includes/class.cooked-measurements.php:251 msgid "Trans Fat" msgstr "" -#: includes/class.cooked-measurements.php:248 +#: includes/class.cooked-measurements.php:252 msgid "Trans Fat" msgstr "" -#: includes/class.cooked-measurements.php:253 +#: includes/class.cooked-measurements.php:257 msgid "Monounsaturated Fat" msgstr "" -#: includes/class.cooked-measurements.php:258 +#: includes/class.cooked-measurements.php:262 msgid "Polyunsaturated Fat" msgstr "" -#: includes/class.cooked-measurements.php:265 +#: includes/class.cooked-measurements.php:269 msgid "Cholesterol" msgstr "" -#: includes/class.cooked-measurements.php:271 +#: includes/class.cooked-measurements.php:275 msgid "Sodium" msgstr "" -#: includes/class.cooked-measurements.php:277 +#: includes/class.cooked-measurements.php:281 msgid "Total Carbohydrate" msgstr "" -#: includes/class.cooked-measurements.php:277 +#: includes/class.cooked-measurements.php:281 msgid "Net Carbohydrate" msgstr "" -#: includes/class.cooked-measurements.php:283 +#: includes/class.cooked-measurements.php:287 msgid "Dietary Fiber" msgstr "" -#: includes/class.cooked-measurements.php:289 +#: includes/class.cooked-measurements.php:293 msgid "Total Sugars" msgstr "" -#: includes/class.cooked-measurements.php:295 +#: includes/class.cooked-measurements.php:299 msgid "Added Sugars" msgstr "" -#: includes/class.cooked-measurements.php:303 +#: includes/class.cooked-measurements.php:307 msgid "Protein" msgstr "" -#: includes/class.cooked-measurements.php:312 +#: includes/class.cooked-measurements.php:316 msgid "Vitamin A" msgstr "" -#: includes/class.cooked-measurements.php:318 +#: includes/class.cooked-measurements.php:322 msgid "Vitamin C" msgstr "" -#: includes/class.cooked-measurements.php:324 +#: includes/class.cooked-measurements.php:328 msgid "Calcium" msgstr "" -#: includes/class.cooked-measurements.php:330 +#: includes/class.cooked-measurements.php:334 msgid "Iron" msgstr "" -#: includes/class.cooked-measurements.php:336 +#: includes/class.cooked-measurements.php:340 msgid "Potassium" msgstr "" -#: includes/class.cooked-measurements.php:342 +#: includes/class.cooked-measurements.php:346 msgid "Vitamin D" msgstr "" -#: includes/class.cooked-measurements.php:348 +#: includes/class.cooked-measurements.php:352 msgid "Vitamin E" msgstr "" -#: includes/class.cooked-measurements.php:354 +#: includes/class.cooked-measurements.php:358 msgid "Vitamin K" msgstr "" -#: includes/class.cooked-measurements.php:360 +#: includes/class.cooked-measurements.php:364 msgid "Thiamin" msgstr "" -#: includes/class.cooked-measurements.php:366 +#: includes/class.cooked-measurements.php:370 msgid "Riboflavin" msgstr "" -#: includes/class.cooked-measurements.php:372 +#: includes/class.cooked-measurements.php:376 msgid "Niacin" msgstr "" -#: includes/class.cooked-measurements.php:378 +#: includes/class.cooked-measurements.php:382 msgid "Vitamin B6" msgstr "" -#: includes/class.cooked-measurements.php:384 +#: includes/class.cooked-measurements.php:388 msgid "Folate" msgstr "" -#: includes/class.cooked-measurements.php:390 +#: includes/class.cooked-measurements.php:394 msgid "Vitamin B12" msgstr "" -#: includes/class.cooked-measurements.php:396 +#: includes/class.cooked-measurements.php:400 msgid "Biotin" msgstr "" -#: includes/class.cooked-measurements.php:402 +#: includes/class.cooked-measurements.php:406 msgid "Pantothenic Acid" msgstr "" -#: includes/class.cooked-measurements.php:408 +#: includes/class.cooked-measurements.php:412 msgid "Phosphorus" msgstr "" -#: includes/class.cooked-measurements.php:414 +#: includes/class.cooked-measurements.php:418 msgid "Iodine" msgstr "" -#: includes/class.cooked-measurements.php:420 +#: includes/class.cooked-measurements.php:424 msgid "Magnesium" msgstr "" -#: includes/class.cooked-measurements.php:426 +#: includes/class.cooked-measurements.php:430 msgid "Zinc" msgstr "" -#: includes/class.cooked-measurements.php:432 +#: includes/class.cooked-measurements.php:436 msgid "Selenium" msgstr "" -#: includes/class.cooked-measurements.php:438 +#: includes/class.cooked-measurements.php:442 msgid "Copper" msgstr "" -#: includes/class.cooked-measurements.php:444 +#: includes/class.cooked-measurements.php:448 msgid "Manganese" msgstr "" -#: includes/class.cooked-measurements.php:450 +#: includes/class.cooked-measurements.php:454 msgid "Chromium" msgstr "" -#: includes/class.cooked-measurements.php:456 +#: includes/class.cooked-measurements.php:460 msgid "Molybdenum" msgstr "" -#: includes/class.cooked-measurements.php:462 +#: includes/class.cooked-measurements.php:466 msgid "Chloride" msgstr "" -#: includes/class.cooked-measurements.php:471 -msgid "mcg" -msgstr "" - #. translators: singular and plural number of minutes (shorthand) -#: includes/class.cooked-measurements.php:721 -#: includes/class.cooked-measurements.php:732 -#: includes/class.cooked-measurements.php:750 +#: includes/class.cooked-measurements.php:722 +#: includes/class.cooked-measurements.php:733 +#: includes/class.cooked-measurements.php:751 #, php-format msgid "%d min" msgstr "" #. translators: singular and plural number of minutes (shorthand) -#: includes/class.cooked-measurements.php:721 -#: includes/class.cooked-measurements.php:732 -#: includes/class.cooked-measurements.php:750 +#: includes/class.cooked-measurements.php:722 +#: includes/class.cooked-measurements.php:733 +#: includes/class.cooked-measurements.php:751 #, php-format msgid "%d mins" msgstr "" #. translators: singular and plural number of hours (shorthand) -#: includes/class.cooked-measurements.php:730 -#: includes/class.cooked-measurements.php:748 +#: includes/class.cooked-measurements.php:731 +#: includes/class.cooked-measurements.php:749 #, php-format msgid "%d hr" msgstr "" #. translators: singular and plural number of hours (shorthand) -#: includes/class.cooked-measurements.php:730 -#: includes/class.cooked-measurements.php:748 +#: includes/class.cooked-measurements.php:731 +#: includes/class.cooked-measurements.php:749 #, php-format msgid "%d hrs" msgstr "" #. translators: singular and plural number of days -#: includes/class.cooked-measurements.php:746 +#: includes/class.cooked-measurements.php:747 #, php-format msgid "%d day" msgstr "" #. translators: singular and plural number of days -#: includes/class.cooked-measurements.php:746 +#: includes/class.cooked-measurements.php:747 #, php-format msgid "%d days" msgstr "" @@ -1295,16 +1303,16 @@ msgstr[1] "" msgid "click here" msgstr "" -#: includes/class.cooked-multilingual.php:260 +#: includes/class.cooked-multilingual.php:262 msgid "Multilingual Setup:" msgstr "" -#: includes/class.cooked-multilingual.php:261 +#: includes/class.cooked-multilingual.php:263 msgid "Your Browse/Search Recipes page is missing translations for:" msgstr "" #. translators: %s is the multilingual plugin name (Polylang or WPML) -#: includes/class.cooked-multilingual.php:266 +#: includes/class.cooked-multilingual.php:268 #, php-format msgid "Create translations of your browse page in %s for full multilingual support." msgstr "" @@ -1329,52 +1337,62 @@ msgstr "" msgid "Required by Cooked Pro" msgstr "" -#: includes/class.cooked-post-types.php:89 +#: includes/class.cooked-post-types.php:90 msgid "Photo" msgstr "" -#: includes/class.cooked-post-types.php:433 -#: includes/class.cooked-settings.php:253 +#: includes/class.cooked-post-types.php:449 +#: includes/class.cooked-settings.php:265 msgid "Recipe Archive" msgstr "" -#: includes/class.cooked-post-types.php:452 +#: includes/class.cooked-post-types.php:466 +msgctxt "post type general name" +msgid "Recipes" +msgstr "" + +#: includes/class.cooked-post-types.php:467 +msgctxt "post type singular name" +msgid "Recipe" +msgstr "" + +#: includes/class.cooked-post-types.php:469 msgid "Recipe" msgstr "" -#: includes/class.cooked-post-types.php:454 +#: includes/class.cooked-post-types.php:471 msgid "Add New Recipe" msgstr "" -#: includes/class.cooked-post-types.php:455 +#: includes/class.cooked-post-types.php:472 msgid "New Recipe" msgstr "" -#: includes/class.cooked-post-types.php:456 +#: includes/class.cooked-post-types.php:473 msgid "Edit Recipe" msgstr "" -#: includes/class.cooked-post-types.php:457 +#: includes/class.cooked-post-types.php:474 msgid "View Recipe" msgstr "" -#: includes/class.cooked-post-types.php:459 +#: includes/class.cooked-post-types.php:476 msgid "Search Recipes" msgstr "" -#: includes/class.cooked-post-types.php:460 +#: includes/class.cooked-post-types.php:477 msgid "No recipes found." msgstr "" -#: includes/class.cooked-post-types.php:461 +#: includes/class.cooked-post-types.php:478 msgid "No recipes found in trash." msgstr "" -#: includes/class.cooked-post-types.php:489 +#: includes/class.cooked-post-types.php:506 msgid "Recipe title ..." msgstr "" -#: includes/class.cooked-post-types.php:520 +#: includes/class.cooked-post-types.php:537 msgid "Cooked Browse Recipes Page" msgstr "" @@ -1391,692 +1409,693 @@ msgstr "" msgid "Error importing WP Recipe Maker recipe." msgstr "" -#: includes/class.cooked-recipe-meta.php:118 +#: includes/class.cooked-recipe-meta.php:124 #: templates/admin/settings.php:10 #: templates/admin/welcome.php:33 msgid "Cooked Settings" msgstr "" -#: includes/class.cooked-recipe-meta.php:217 +#. translators: %s: recipe embed shortcode +#: includes/class.cooked-recipe-meta.php:229 #, php-format msgid "This recipe is set up to include itself in the Recipe Template (containing shortcode %s), which can break the page. Remove the embed that references this same recipe." msgstr "" -#: includes/class.cooked-recipe-meta.php:258 +#: includes/class.cooked-recipe-meta.php:271 msgid "Enter one item per line. Use the checkboxes below to mark section headings." msgstr "" -#: includes/class.cooked-recipe-meta.php:261 +#: includes/class.cooked-recipe-meta.php:274 msgid "Preview" msgstr "" -#: includes/class.cooked-recipe-meta.php:265 +#: includes/class.cooked-recipe-meta.php:278 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:270 +#: includes/class.cooked-recipe-meta.php:283 msgid "Cancel" msgstr "" -#: includes/class.cooked-recipe-meta.php:288 +#: includes/class.cooked-recipe-meta.php:301 msgid "Display Recipe" msgstr "" -#: includes/class.cooked-recipe-meta.php:289 +#: includes/class.cooked-recipe-meta.php:302 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:301 +#: includes/class.cooked-recipe-meta.php:314 msgid "Recipe Card" msgstr "" -#: includes/class.cooked-recipe-meta.php:302 +#: includes/class.cooked-recipe-meta.php:315 msgid "Displays a compact linked recipe card with image, title, author, and excerpt — not the full recipe. Use this to promote this recipe elsewhere on your site." msgstr "" -#: includes/class.cooked-recipe-meta.php:310 +#: includes/class.cooked-recipe-meta.php:323 msgid "Choose \"modern\" or \"modern-centered\"." msgstr "" -#: includes/class.cooked-recipe-meta.php:317 +#: includes/class.cooked-recipe-meta.php:330 msgid "Set the card width. Defaults to 100%. Use \"%\" or \"px\" after the number." msgstr "" -#: includes/class.cooked-recipe-meta.php:327 +#: includes/class.cooked-recipe-meta.php:340 msgid "Hide the recipe excerpt." msgstr "" -#: includes/class.cooked-recipe-meta.php:334 +#: includes/class.cooked-recipe-meta.php:347 msgid "Hide the recipe author." msgstr "" -#: includes/class.cooked-recipe-meta.php:344 +#: includes/class.cooked-recipe-meta.php:357 msgid "Hide the recipe image." msgstr "" -#: includes/class.cooked-recipe-meta.php:351 +#: includes/class.cooked-recipe-meta.php:364 msgid "Hide the recipe title." msgstr "" -#: includes/class.cooked-recipe-meta.php:361 -#: includes/class.cooked-recipe-meta.php:1316 -#: includes/class.cooked-recipe-meta.php:1362 -#: includes/class.cooked-recipe-meta.php:1393 -#: includes/class.cooked-recipe-meta.php:1418 -#: includes/class.cooked-recipe-meta.php:1442 -#: includes/class.cooked-recipe-meta.php:1502 -#: includes/class.cooked-recipe-meta.php:1547 -#: includes/class.cooked-recipe-meta.php:1577 -#: includes/class.cooked-recipe-meta.php:1622 -#: includes/class.cooked-recipe-meta.php:1745 +#: includes/class.cooked-recipe-meta.php:374 +#: includes/class.cooked-recipe-meta.php:1329 +#: includes/class.cooked-recipe-meta.php:1375 +#: includes/class.cooked-recipe-meta.php:1406 +#: includes/class.cooked-recipe-meta.php:1431 +#: includes/class.cooked-recipe-meta.php:1455 +#: includes/class.cooked-recipe-meta.php:1515 +#: includes/class.cooked-recipe-meta.php:1560 +#: includes/class.cooked-recipe-meta.php:1590 +#: includes/class.cooked-recipe-meta.php:1635 +#: includes/class.cooked-recipe-meta.php:1758 msgid "Available Variables" msgstr "" -#: includes/class.cooked-recipe-meta.php:363 -#: includes/class.cooked-recipe-meta.php:1747 +#: includes/class.cooked-recipe-meta.php:376 +#: includes/class.cooked-recipe-meta.php:1760 msgid "Recipe ID" msgstr "" -#: includes/class.cooked-recipe-meta.php:364 +#: includes/class.cooked-recipe-meta.php:377 msgid "Card width" msgstr "" -#: includes/class.cooked-recipe-meta.php:365 +#: includes/class.cooked-recipe-meta.php:378 msgid "modern, modern-centered" msgstr "" -#: includes/class.cooked-recipe-meta.php:366 -#: includes/class.cooked-recipe-meta.php:367 -#: includes/class.cooked-recipe-meta.php:368 -#: includes/class.cooked-recipe-meta.php:369 -#: includes/class.cooked-recipe-meta.php:1751 -#: includes/class.cooked-recipe-meta.php:1752 -#: includes/class.cooked-recipe-meta.php:1753 -#: includes/class.cooked-recipe-meta.php:1754 +#: includes/class.cooked-recipe-meta.php:379 +#: includes/class.cooked-recipe-meta.php:380 +#: includes/class.cooked-recipe-meta.php:381 +#: includes/class.cooked-recipe-meta.php:382 +#: includes/class.cooked-recipe-meta.php:1764 +#: includes/class.cooked-recipe-meta.php:1765 +#: includes/class.cooked-recipe-meta.php:1766 +#: includes/class.cooked-recipe-meta.php:1767 msgid "true/false" msgstr "" -#: includes/class.cooked-recipe-meta.php:371 -#: includes/class.cooked-recipe-meta.php:1756 +#: includes/class.cooked-recipe-meta.php:384 +#: includes/class.cooked-recipe-meta.php:1769 msgid "Example" msgstr "" -#: includes/class.cooked-recipe-meta.php:409 +#: includes/class.cooked-recipe-meta.php:422 msgid "Layout" msgstr "" -#: includes/class.cooked-recipe-meta.php:433 -#: includes/class.cooked-recipe-meta.php:1459 +#: includes/class.cooked-recipe-meta.php:446 +#: includes/class.cooked-recipe-meta.php:1472 msgid "Gallery" msgstr "" -#: includes/class.cooked-recipe-meta.php:439 +#: includes/class.cooked-recipe-meta.php:452 msgid "Shortcodes" msgstr "" -#: includes/class.cooked-recipe-meta.php:496 +#: includes/class.cooked-recipe-meta.php:509 msgid "Recipe Review Required" msgstr "" #. translators: for displaying singular or plural versions depending on the number of recipes. -#: includes/class.cooked-recipe-meta.php:499 +#: includes/class.cooked-recipe-meta.php:512 #, 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:507 +#: includes/class.cooked-recipe-meta.php:520 msgid "Recipe Shortcode" msgstr "" -#: includes/class.cooked-recipe-meta.php:508 +#: includes/class.cooked-recipe-meta.php:521 msgid "You can use the following shortcode to display your recipe anywhere:" msgstr "" -#: includes/class.cooked-recipe-meta.php:522 +#: includes/class.cooked-recipe-meta.php:535 msgid "Recipe Template" msgstr "" -#: includes/class.cooked-recipe-meta.php:522 +#: includes/class.cooked-recipe-meta.php:535 msgid "Default Recipe Template" msgstr "" -#: includes/class.cooked-recipe-meta.php:522 +#: includes/class.cooked-recipe-meta.php:535 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:522 +#: includes/class.cooked-recipe-meta.php:535 msgid "Save as Default" msgstr "" -#: includes/class.cooked-recipe-meta.php:522 +#: includes/class.cooked-recipe-meta.php:535 msgid "Apply to All" msgstr "" -#: includes/class.cooked-recipe-meta.php:522 +#: includes/class.cooked-recipe-meta.php:535 msgid "Reset" msgstr "" -#: includes/class.cooked-recipe-meta.php:522 +#: includes/class.cooked-recipe-meta.php:535 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:540 +#: includes/class.cooked-recipe-meta.php:553 msgid "Recipe Excerpt" msgstr "" -#: includes/class.cooked-recipe-meta.php:540 +#: includes/class.cooked-recipe-meta.php:553 msgid "The excerpt is used on recipe listing templates, where the full recipe should not be displayed." msgstr "" -#: includes/class.cooked-recipe-meta.php:563 +#: includes/class.cooked-recipe-meta.php:576 msgid "SEO Description" msgstr "" -#: includes/class.cooked-recipe-meta.php:563 +#: includes/class.cooked-recipe-meta.php:576 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:574 -#: includes/class.cooked-settings.php:326 +#: includes/class.cooked-recipe-meta.php:587 +#: includes/class.cooked-settings.php:338 msgid "Difficulty Level" msgstr "" -#: includes/class.cooked-recipe-meta.php:583 -#: includes/class.cooked-recipe-meta.php:1321 -#: includes/class.cooked-settings.php:329 -#: includes/class.cooked-shortcodes.php:509 -#: includes/class.cooked-shortcodes.php:732 +#: includes/class.cooked-recipe-meta.php:596 +#: includes/class.cooked-recipe-meta.php:1334 +#: includes/class.cooked-settings.php:341 +#: includes/class.cooked-shortcodes.php:513 +#: includes/class.cooked-shortcodes.php:736 msgid "Prep Time" msgstr "" -#: includes/class.cooked-recipe-meta.php:585 -#: includes/class.cooked-recipe-meta.php:590 -#: includes/class.cooked-recipe-meta.php:595 +#: includes/class.cooked-recipe-meta.php:598 +#: includes/class.cooked-recipe-meta.php:603 +#: includes/class.cooked-recipe-meta.php:608 msgid "minutes" msgstr "" -#: includes/class.cooked-recipe-meta.php:588 -#: includes/class.cooked-recipe-meta.php:1322 -#: includes/class.cooked-settings.php:330 -#: includes/class.cooked-shortcodes.php:510 -#: includes/class.cooked-shortcodes.php:741 +#: includes/class.cooked-recipe-meta.php:601 +#: includes/class.cooked-recipe-meta.php:1335 +#: includes/class.cooked-settings.php:342 +#: includes/class.cooked-shortcodes.php:514 +#: includes/class.cooked-shortcodes.php:745 msgid "Cook Time" msgstr "" -#: includes/class.cooked-recipe-meta.php:593 -#: includes/class.cooked-recipe-meta.php:1323 -#: includes/class.cooked-settings.php:331 -#: includes/class.cooked-shortcodes.php:511 -#: includes/class.cooked-shortcodes.php:752 -#: includes/class.cooked-shortcodes.php:759 +#: includes/class.cooked-recipe-meta.php:606 +#: includes/class.cooked-recipe-meta.php:1336 +#: includes/class.cooked-settings.php:343 +#: includes/class.cooked-shortcodes.php:515 +#: includes/class.cooked-shortcodes.php:756 +#: includes/class.cooked-shortcodes.php:763 msgid "Total Time" msgstr "" -#: includes/class.cooked-recipe-meta.php:601 +#: includes/class.cooked-recipe-meta.php:614 msgid "Recipe Notes" msgstr "" -#: includes/class.cooked-recipe-meta.php:601 +#: includes/class.cooked-recipe-meta.php:614 msgid "The notes are displayed in the recipe." msgstr "" -#: includes/class.cooked-recipe-meta.php:666 -#: includes/class.cooked-recipe-meta.php:758 -#: includes/class.cooked-recipe-meta.php:825 +#: includes/class.cooked-recipe-meta.php:679 +#: includes/class.cooked-recipe-meta.php:771 +#: includes/class.cooked-recipe-meta.php:838 msgid "ex. Eggs, Milk, etc." msgstr "" -#: includes/class.cooked-recipe-meta.php:675 -#: includes/class.cooked-recipe-meta.php:767 -#: includes/class.cooked-recipe-meta.php:834 -msgid "Substitution:" -msgstr "" - #: includes/class.cooked-recipe-meta.php:688 #: includes/class.cooked-recipe-meta.php:780 #: includes/class.cooked-recipe-meta.php:847 +msgid "Substitution:" +msgstr "" + +#: includes/class.cooked-recipe-meta.php:701 +#: includes/class.cooked-recipe-meta.php:793 +#: includes/class.cooked-recipe-meta.php:860 msgid "ex. Apple Sauce, Tofu, etc." msgstr "" -#: includes/class.cooked-recipe-meta.php:699 -#: includes/class.cooked-recipe-meta.php:855 -#: includes/class.cooked-recipe-meta.php:939 -#: includes/class.cooked-recipe-meta.php:1050 +#: includes/class.cooked-recipe-meta.php:712 +#: includes/class.cooked-recipe-meta.php:868 +#: includes/class.cooked-recipe-meta.php:952 +#: includes/class.cooked-recipe-meta.php:1063 msgid "Section Heading" msgstr "" -#: includes/class.cooked-recipe-meta.php:703 -#: includes/class.cooked-recipe-meta.php:859 -#: includes/class.cooked-recipe-meta.php:943 -#: includes/class.cooked-recipe-meta.php:1054 +#: includes/class.cooked-recipe-meta.php:716 +#: includes/class.cooked-recipe-meta.php:872 +#: includes/class.cooked-recipe-meta.php:956 +#: includes/class.cooked-recipe-meta.php:1067 msgid "Heading Element:" msgstr "" -#: includes/class.cooked-recipe-meta.php:794 +#: includes/class.cooked-recipe-meta.php:807 msgid "Add Ingredient" msgstr "" -#: includes/class.cooked-recipe-meta.php:795 -#: includes/class.cooked-recipe-meta.php:1019 +#: includes/class.cooked-recipe-meta.php:808 +#: includes/class.cooked-recipe-meta.php:1032 msgid "Add Section Heading" msgstr "" -#: includes/class.cooked-recipe-meta.php:797 -#: includes/class.cooked-recipe-meta.php:1021 +#: includes/class.cooked-recipe-meta.php:810 +#: includes/class.cooked-recipe-meta.php:1034 msgid "Bulk Add" msgstr "" -#: includes/class.cooked-recipe-meta.php:1018 +#: includes/class.cooked-recipe-meta.php:1031 msgid "Add Direction" msgstr "" -#: includes/class.cooked-recipe-meta.php:1085 +#: includes/class.cooked-recipe-meta.php:1098 msgid "Nutrition Information" msgstr "" -#: includes/class.cooked-recipe-meta.php:1123 -#: includes/class.cooked-shortcodes.php:1123 +#: includes/class.cooked-recipe-meta.php:1136 +#: includes/class.cooked-shortcodes.php:1127 msgid "Nutrition Facts" msgstr "" -#: includes/class.cooked-recipe-meta.php:1141 -#: includes/class.cooked-shortcodes.php:1091 +#: includes/class.cooked-recipe-meta.php:1154 +#: includes/class.cooked-shortcodes.php:1095 msgid "Amount per serving" msgstr "" -#: includes/class.cooked-recipe-meta.php:1151 -#: includes/class.cooked-shortcodes.php:1101 +#: includes/class.cooked-recipe-meta.php:1164 +#: includes/class.cooked-shortcodes.php:1105 msgid "% Daily Value *" msgstr "" -#: includes/class.cooked-recipe-meta.php:1170 -#: includes/class.cooked-shortcodes.php:1033 +#: includes/class.cooked-recipe-meta.php:1183 +#: includes/class.cooked-shortcodes.php:1037 msgid "Includes" msgstr "" -#: includes/class.cooked-recipe-meta.php:1202 -#: includes/class.cooked-shortcodes.php:1127 +#: includes/class.cooked-recipe-meta.php:1215 +#: includes/class.cooked-shortcodes.php:1131 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:1218 +#: includes/class.cooked-recipe-meta.php:1231 msgid "Recipe Gallery Type" msgstr "" -#: includes/class.cooked-recipe-meta.php:1231 +#: includes/class.cooked-recipe-meta.php:1244 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:1245 +#: includes/class.cooked-recipe-meta.php:1258 #, 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:1249 +#: includes/class.cooked-recipe-meta.php:1262 #, 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:1254 +#: includes/class.cooked-recipe-meta.php:1267 msgid "Gallery Items" msgstr "" -#: includes/class.cooked-recipe-meta.php:1285 +#: includes/class.cooked-recipe-meta.php:1298 msgid "Recipe Information" msgstr "" -#: includes/class.cooked-recipe-meta.php:1286 +#: includes/class.cooked-recipe-meta.php:1299 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:1295 -#: includes/class.cooked-recipe-meta.php:1305 +#: includes/class.cooked-recipe-meta.php:1308 +#: includes/class.cooked-recipe-meta.php:1318 #, php-format msgid "\"%1$s\" and \"%2$s\"" msgstr "" -#: includes/class.cooked-recipe-meta.php:1297 +#: includes/class.cooked-recipe-meta.php:1310 msgid "This will allow you to include or exclude content from the shortcode output." msgstr "" -#: includes/class.cooked-recipe-meta.php:1306 +#: includes/class.cooked-recipe-meta.php:1319 msgid "Used like \"include\", but will position the content to the left or right." msgstr "" -#: includes/class.cooked-recipe-meta.php:1320 -#: includes/class.cooked-settings.php:324 -#: includes/class.cooked-shortcodes.php:506 -#: includes/class.cooked-shortcodes.php:684 +#: includes/class.cooked-recipe-meta.php:1333 +#: includes/class.cooked-settings.php:336 +#: includes/class.cooked-shortcodes.php:510 +#: includes/class.cooked-shortcodes.php:688 msgid "Author" msgstr "" -#: includes/class.cooked-recipe-meta.php:1324 -#: includes/class.cooked-shortcodes.php:507 -#: includes/class.cooked-shortcodes.php:695 +#: includes/class.cooked-recipe-meta.php:1337 +#: includes/class.cooked-shortcodes.php:511 +#: includes/class.cooked-shortcodes.php:699 msgid "Difficulty" msgstr "" -#: includes/class.cooked-recipe-meta.php:1325 +#: includes/class.cooked-recipe-meta.php:1338 msgid "Servings Switcher" msgstr "" -#: includes/class.cooked-recipe-meta.php:1326 -#: includes/class.cooked-settings.php:325 -#: includes/class.cooked-shortcodes.php:779 -#: includes/class.cooked-shortcodes.php:782 +#: includes/class.cooked-recipe-meta.php:1339 +#: includes/class.cooked-settings.php:337 +#: includes/class.cooked-shortcodes.php:783 +#: includes/class.cooked-shortcodes.php:786 #: includes/class.cooked-taxonomies.php:39 msgid "Category" msgstr "" -#: includes/class.cooked-recipe-meta.php:1327 +#: includes/class.cooked-recipe-meta.php:1340 msgid "Print Mode" msgstr "" -#: includes/class.cooked-recipe-meta.php:1328 +#: includes/class.cooked-recipe-meta.php:1341 msgid "Full-Screen Mode" msgstr "" -#: includes/class.cooked-recipe-meta.php:1348 +#: includes/class.cooked-recipe-meta.php:1361 msgid "This will display the list of ingredients, added via the \"Ingredients\" tab." msgstr "" -#: includes/class.cooked-recipe-meta.php:1354 +#: includes/class.cooked-recipe-meta.php:1367 msgid "This will allow you to hide or show the checkboxes:" msgstr "" -#: includes/class.cooked-recipe-meta.php:1364 +#: includes/class.cooked-recipe-meta.php:1377 msgid "Show checkboxes" msgstr "" -#: includes/class.cooked-recipe-meta.php:1365 +#: includes/class.cooked-recipe-meta.php:1378 msgid "Hide checkboxes" msgstr "" -#: includes/class.cooked-recipe-meta.php:1379 +#: includes/class.cooked-recipe-meta.php:1392 msgid "This will display the list of directions, added via the \"Directions\" tab." msgstr "" -#: includes/class.cooked-recipe-meta.php:1385 +#: includes/class.cooked-recipe-meta.php:1398 msgid "This will allow you to hide or show the numbers:" msgstr "" -#: includes/class.cooked-recipe-meta.php:1395 +#: includes/class.cooked-recipe-meta.php:1408 msgid "Show numbers" msgstr "" -#: includes/class.cooked-recipe-meta.php:1396 +#: includes/class.cooked-recipe-meta.php:1409 msgid "Hide numbers" msgstr "" -#: includes/class.cooked-recipe-meta.php:1409 +#: includes/class.cooked-recipe-meta.php:1422 msgid "Featured Image" msgstr "" -#: includes/class.cooked-recipe-meta.php:1410 +#: includes/class.cooked-recipe-meta.php:1423 msgid "This will display the featured image, if one is set." msgstr "" -#: includes/class.cooked-recipe-meta.php:1420 -#: includes/class.cooked-recipe-meta.php:1444 -#: includes/class.cooked-recipe-meta.php:1549 +#: includes/class.cooked-recipe-meta.php:1433 +#: includes/class.cooked-recipe-meta.php:1457 +#: includes/class.cooked-recipe-meta.php:1562 msgid "None" msgstr "" -#: includes/class.cooked-recipe-meta.php:1433 +#: includes/class.cooked-recipe-meta.php:1446 msgid "Nutrition Label" msgstr "" -#: includes/class.cooked-recipe-meta.php:1434 +#: includes/class.cooked-recipe-meta.php:1447 msgid "This will display the Nutrition Facts label, if data is present." msgstr "" -#: includes/class.cooked-recipe-meta.php:1460 +#: includes/class.cooked-recipe-meta.php:1473 msgid "This will display the gallery, if one is set or created from the \"Gallery\" tab." msgstr "" -#: includes/class.cooked-recipe-meta.php:1468 +#: includes/class.cooked-recipe-meta.php:1481 msgid "Set the width of the gallery." msgstr "" -#: includes/class.cooked-recipe-meta.php:1475 +#: includes/class.cooked-recipe-meta.php:1488 msgid "Set the image size ratio." msgstr "" -#: includes/class.cooked-recipe-meta.php:1485 +#: includes/class.cooked-recipe-meta.php:1498 msgid "Set the navigation style." msgstr "" -#: includes/class.cooked-recipe-meta.php:1492 +#: includes/class.cooked-recipe-meta.php:1505 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:1507 +#: includes/class.cooked-recipe-meta.php:1520 #, 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:1512 +#: includes/class.cooked-recipe-meta.php:1525 #, 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:1517 +#: includes/class.cooked-recipe-meta.php:1530 #, 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:1522 +#: includes/class.cooked-recipe-meta.php:1535 #, php-format msgid "\"%1$s\" or \"%2$s\"" msgstr "" -#: includes/class.cooked-recipe-meta.php:1539 +#: includes/class.cooked-recipe-meta.php:1552 msgid "This will display the excerpt, if one is available from the \"Layout & Content\" tab." msgstr "" -#: includes/class.cooked-recipe-meta.php:1563 +#: includes/class.cooked-recipe-meta.php:1576 msgid "This will display the notes, if one is available from the \"Layout & Content\" tab." msgstr "" -#: includes/class.cooked-recipe-meta.php:1569 +#: includes/class.cooked-recipe-meta.php:1582 msgid "This will allow you to hide or show the header for the notes section:" msgstr "" -#: includes/class.cooked-recipe-meta.php:1579 +#: includes/class.cooked-recipe-meta.php:1592 msgid "Show header" msgstr "" -#: includes/class.cooked-recipe-meta.php:1580 +#: includes/class.cooked-recipe-meta.php:1593 msgid "Hide header" msgstr "" -#: includes/class.cooked-recipe-meta.php:1594 +#: includes/class.cooked-recipe-meta.php:1607 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:1603 +#: includes/class.cooked-recipe-meta.php:1616 #, php-format msgid "\"%1$s\", \"%2$s\" and \"%3$s\"" msgstr "" -#: includes/class.cooked-recipe-meta.php:1605 +#: includes/class.cooked-recipe-meta.php:1618 msgid "Use just one or a combination of all three to set the timer length" msgstr "" -#: includes/class.cooked-recipe-meta.php:1612 +#: includes/class.cooked-recipe-meta.php:1625 msgid "Add a short description for this timer, if applicable." msgstr "" -#: includes/class.cooked-recipe-meta.php:1624 +#: includes/class.cooked-recipe-meta.php:1637 msgid "Time in seconds" msgstr "" -#: includes/class.cooked-recipe-meta.php:1625 +#: includes/class.cooked-recipe-meta.php:1638 msgid "Time in minutes" msgstr "" -#: includes/class.cooked-recipe-meta.php:1626 +#: includes/class.cooked-recipe-meta.php:1639 msgid "Time in hours" msgstr "" -#: includes/class.cooked-recipe-meta.php:1627 +#: includes/class.cooked-recipe-meta.php:1640 msgid "Timer Description" msgstr "" -#: includes/class.cooked-recipe-meta.php:1640 +#: includes/class.cooked-recipe-meta.php:1653 msgid "Next & Previous Recipe Navigation" msgstr "" -#: includes/class.cooked-recipe-meta.php:1641 +#: includes/class.cooked-recipe-meta.php:1654 msgid "This will display navigation links to the next and previous recipes." msgstr "" -#: includes/class.cooked-recipe-meta.php:1645 +#: includes/class.cooked-recipe-meta.php:1658 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:1650 +#: includes/class.cooked-recipe-meta.php:1663 msgid "Usage" msgstr "" -#: includes/class.cooked-recipe-meta.php:1652 +#: includes/class.cooked-recipe-meta.php:1665 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:1665 +#: includes/class.cooked-recipe-meta.php:1678 #: includes/class.cooked-related-recipes.php:34 msgid "Related Recipes" msgstr "" -#: includes/class.cooked-recipe-meta.php:1666 +#: includes/class.cooked-recipe-meta.php:1679 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:1674 +#: includes/class.cooked-recipe-meta.php:1687 msgid "Specify a recipe ID. If not provided, uses the current recipe." msgstr "" -#: includes/class.cooked-recipe-meta.php:1681 +#: includes/class.cooked-recipe-meta.php:1694 msgid "Set the heading text for the related recipes section." msgstr "" -#: includes/class.cooked-recipe-meta.php:1691 +#: includes/class.cooked-recipe-meta.php:1704 msgid "Number of recipes to display (default: 4)." msgstr "" -#: includes/class.cooked-recipe-meta.php:1698 +#: includes/class.cooked-recipe-meta.php:1711 msgid "Number of columns in the grid (default: 2)." msgstr "" -#: includes/class.cooked-recipe-meta.php:1708 +#: includes/class.cooked-recipe-meta.php:1721 msgid "Hide recipe card images." msgstr "" -#: includes/class.cooked-recipe-meta.php:1715 +#: includes/class.cooked-recipe-meta.php:1728 msgid "Hide recipe card excerpts." msgstr "" -#: includes/class.cooked-recipe-meta.php:1725 +#: includes/class.cooked-recipe-meta.php:1738 msgid "Hide recipe card authors." msgstr "" -#: includes/class.cooked-recipe-meta.php:1732 +#: includes/class.cooked-recipe-meta.php:1745 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:1739 +#: includes/class.cooked-recipe-meta.php:1752 msgid "Matching options:" msgstr "" -#: includes/class.cooked-recipe-meta.php:1740 +#: includes/class.cooked-recipe-meta.php:1753 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:1749 +#: includes/class.cooked-recipe-meta.php:1762 msgid "Number of recipes" msgstr "" -#: includes/class.cooked-recipe-meta.php:1750 +#: includes/class.cooked-recipe-meta.php:1763 msgid "Grid columns" msgstr "" #. translators: stating the recipe author with a "By" in front of it. (ex: "By John Smith") #. translators: referring to the author (ex: By John Smith) -#: includes/class.cooked-recipes.php:298 -#: includes/class.cooked-recipes.php:352 +#: includes/class.cooked-recipes.php:300 +#: includes/class.cooked-recipes.php:354 #: templates/front/recipe-single.php:47 #, php-format msgid "By %s" msgstr "" #. translators: For showing "All" of a taxonomy (ex: "All Burgers") -#: includes/class.cooked-recipes.php:445 +#: includes/class.cooked-recipes.php:449 #, php-format msgid "All %s" msgstr "" -#: includes/class.cooked-recipes.php:829 +#: includes/class.cooked-recipes.php:833 msgid "Beginner" msgstr "" -#: includes/class.cooked-recipes.php:830 +#: includes/class.cooked-recipes.php:834 msgid "Intermediate" msgstr "" -#: includes/class.cooked-recipes.php:831 +#: includes/class.cooked-recipes.php:835 msgid "Advanced" msgstr "" -#: includes/class.cooked-recipes.php:857 +#: includes/class.cooked-recipes.php:861 msgid "Cooked Gallery" msgstr "" -#: includes/class.cooked-recipes.php:861 +#: includes/class.cooked-recipes.php:865 msgid "Envira Gallery" msgstr "" -#: includes/class.cooked-recipes.php:865 +#: includes/class.cooked-recipes.php:869 msgid "Soliloquy Slider" msgstr "" -#: includes/class.cooked-recipes.php:869 +#: includes/class.cooked-recipes.php:873 msgid "Slider Revolution" msgstr "" -#: includes/class.cooked-recipes.php:935 -#: includes/class.cooked-recipes.php:945 +#: includes/class.cooked-recipes.php:939 +#: includes/class.cooked-recipes.php:949 msgid "Default" msgstr "" -#: includes/class.cooked-recipes.php:936 -#: includes/class.cooked-recipes.php:946 +#: includes/class.cooked-recipes.php:940 +#: includes/class.cooked-recipes.php:950 msgid "Metric" msgstr "" -#: includes/class.cooked-recipes.php:937 -#: includes/class.cooked-recipes.php:947 +#: includes/class.cooked-recipes.php:941 +#: includes/class.cooked-recipes.php:951 msgid "Imperial" msgstr "" -#: includes/class.cooked-recipes.php:941 +#: includes/class.cooked-recipes.php:945 msgid "Units" msgstr "" -#: includes/class.cooked-recipes.php:943 +#: includes/class.cooked-recipes.php:947 msgid "Measurement System" msgstr "" #. translators: singular and plural quarter "serving" size -#: includes/class.cooked-recipes.php:970 +#: includes/class.cooked-recipes.php:975 #, php-format msgid "Quarter (%s Serving)" msgid_plural "Quarter (%s Servings)" @@ -2084,7 +2103,7 @@ msgstr[0] "" msgstr[1] "" #. translators: singular and plural quarter "serving" size -#: includes/class.cooked-recipes.php:973 +#: includes/class.cooked-recipes.php:978 #, php-format msgid "Half (%s Serving)" msgid_plural "Half (%s Servings)" @@ -2092,7 +2111,7 @@ msgstr[0] "" msgstr[1] "" #. translators: singular and plural quarter "serving" size -#: includes/class.cooked-recipes.php:976 +#: includes/class.cooked-recipes.php:981 #, php-format msgid "Default (%s Serving)" msgid_plural "Default (%s Servings)" @@ -2100,86 +2119,87 @@ msgstr[0] "" msgstr[1] "" #. translators: singular and plural quarter "serving" size -#: includes/class.cooked-recipes.php:979 +#: includes/class.cooked-recipes.php:984 #, php-format msgid "Double (%s Servings)" msgstr "" #. translators: singular and plural quarter "serving" size -#: includes/class.cooked-recipes.php:982 +#: includes/class.cooked-recipes.php:987 #, php-format msgid "Triple (%s Servings)" msgstr "" -#: includes/class.cooked-recipes.php:996 -#: includes/class.cooked-shortcodes.php:508 +#: includes/class.cooked-recipes.php:1001 +#: includes/class.cooked-shortcodes.php:512 msgid "Yields" msgstr "" #. translators: singular and plural "serving" sizes -#: includes/class.cooked-recipes.php:1000 -#: includes/class.cooked-recipes.php:1011 +#: includes/class.cooked-recipes.php:1005 +#: includes/class.cooked-recipes.php:1016 #, php-format msgid "%s Serving" msgid_plural "%s Servings" msgstr[0] "" msgstr[1] "" -#: includes/class.cooked-recipes.php:1143 -#: includes/class.cooked-recipes.php:1157 +#: includes/class.cooked-recipes.php:1148 +#: includes/class.cooked-recipes.php:1162 msgid "or" msgstr "" #. translators: singular and plural "steps" -#: includes/class.cooked-recipes.php:1202 -#: includes/class.cooked-seo.php:83 +#. translators: %d: step number +#: includes/class.cooked-recipes.php:1207 +#: includes/class.cooked-seo.php:84 #, php-format msgid "Step %d" msgstr "" -#: includes/class.cooked-recipes.php:1262 +#: includes/class.cooked-recipes.php:1267 msgid "Browse" msgstr "" -#: includes/class.cooked-recipes.php:1280 -#: includes/class.cooked-settings.php:251 +#: includes/class.cooked-recipes.php:1285 +#: includes/class.cooked-settings.php:263 msgid "No categories" msgstr "" -#: includes/class.cooked-recipes.php:1283 -#: includes/class.cooked-settings.php:300 +#: includes/class.cooked-recipes.php:1288 +#: includes/class.cooked-settings.php:312 #: includes/class.cooked-taxonomies.php:38 #: includes/class.cooked-taxonomies.php:48 msgid "Categories" msgstr "" -#: includes/class.cooked-recipes.php:1285 +#: includes/class.cooked-recipes.php:1290 #: includes/class.cooked-taxonomies.php:41 #: includes/widgets/recipe-categories.php:63 msgid "All Categories" msgstr "" -#: includes/class.cooked-recipes.php:1356 +#: includes/class.cooked-recipes.php:1361 msgid "Find a recipe..." msgstr "" -#: includes/class.cooked-recipes.php:1358 +#: includes/class.cooked-recipes.php:1363 msgid "Search" msgstr "" -#: includes/class.cooked-recipes.php:1371 +#: includes/class.cooked-recipes.php:1376 msgid "Newest first" msgstr "" -#: includes/class.cooked-recipes.php:1375 +#: includes/class.cooked-recipes.php:1380 msgid "Oldest first" msgstr "" -#: includes/class.cooked-recipes.php:1379 +#: includes/class.cooked-recipes.php:1384 msgid "Alphabetical (A-Z)" msgstr "" -#: includes/class.cooked-recipes.php:1383 +#: includes/class.cooked-recipes.php:1388 msgid "Alphabetical (Z-A)" msgstr "" @@ -2187,463 +2207,467 @@ msgstr "" msgid "Recipe Editor" msgstr "" -#: includes/class.cooked-settings.php:110 +#: includes/class.cooked-settings.php:119 msgid "Cooked settings has been updated!" msgstr "" -#: includes/class.cooked-settings.php:129 +#: includes/class.cooked-settings.php:140 msgid "Cooked Plugin Setup" msgstr "" -#: includes/class.cooked-settings.php:130 +#. translators: %s: Browse/Search Recipes Page link +#: includes/class.cooked-settings.php:142 #, php-format msgid "To display your recipes properly, please set up your %s." msgstr "" -#: includes/class.cooked-settings.php:131 -#: includes/class.cooked-settings.php:277 +#: includes/class.cooked-settings.php:143 +#: includes/class.cooked-settings.php:289 msgid "Browse/Search Recipes Page" msgstr "" -#: includes/class.cooked-settings.php:250 +#: includes/class.cooked-settings.php:262 msgid "Choose a page..." msgstr "" -#: includes/class.cooked-settings.php:250 +#: includes/class.cooked-settings.php:262 msgid "No pages" msgstr "" -#: includes/class.cooked-settings.php:251 +#: includes/class.cooked-settings.php:263 msgid "No default" msgstr "" -#: includes/class.cooked-settings.php:273 +#: includes/class.cooked-settings.php:285 msgid "General" msgstr "" #. translators: a description on how to add the [cooked-browse] shortcode to a page -#: includes/class.cooked-settings.php:279 +#: includes/class.cooked-settings.php:291 #, php-format msgid "Create a page with the %s shortcode on it, then choose it from this dropdown." msgstr "" #. translators: a description on how to add the [cooked-browse] shortcode to a page -#: includes/class.cooked-settings.php:279 +#: includes/class.cooked-settings.php:291 msgid "Note: This setting is required for the plugin to function properly." msgstr "" -#: includes/class.cooked-settings.php:285 +#: includes/class.cooked-settings.php:297 msgid "Recipes Per Page" msgstr "" #. translators: a description on how to choose the default number of recipes per page. -#: includes/class.cooked-settings.php:287 +#: includes/class.cooked-settings.php:299 #, php-format msgid "Choose the default (set via the %s panel) or choose a different number here." msgstr "" #. translators: a description on how to choose the default number of recipes per page. -#: includes/class.cooked-settings.php:287 +#: includes/class.cooked-settings.php:299 msgid "Settings > Reading" msgstr "" -#: includes/class.cooked-settings.php:293 +#: includes/class.cooked-settings.php:305 msgid "Recipe Taxonomies" msgstr "" -#: includes/class.cooked-settings.php:294 +#: includes/class.cooked-settings.php:306 msgid "Choose which taxonomies you want to enable for your recipes." msgstr "" -#: includes/class.cooked-settings.php:305 +#: includes/class.cooked-settings.php:317 msgid "Global Recipe Toggles" msgstr "" -#: includes/class.cooked-settings.php:306 +#: includes/class.cooked-settings.php:318 msgid "You can quickly hide or show different recipe elements (site-wide) with these checkboxes." msgstr "" -#: includes/class.cooked-settings.php:337 +#: includes/class.cooked-settings.php:349 msgid "Print View" msgstr "" -#: includes/class.cooked-settings.php:338 +#: includes/class.cooked-settings.php:350 msgid "When enabled, the website logo will appear at the top of the recipe print screen." msgstr "" -#: includes/class.cooked-settings.php:344 +#: includes/class.cooked-settings.php:356 msgid "Show Website Logo" msgstr "" -#: includes/class.cooked-settings.php:349 +#: includes/class.cooked-settings.php:361 msgid "Carbs Format" msgstr "" -#: includes/class.cooked-settings.php:350 +#: includes/class.cooked-settings.php:362 msgid "You can display carbs as \"Total\" or \"Net\"." msgstr "" -#: includes/class.cooked-settings.php:356 +#: includes/class.cooked-settings.php:368 msgid "Total Carbs" msgstr "" -#: includes/class.cooked-settings.php:357 +#: includes/class.cooked-settings.php:369 msgid "Net Carbs" msgstr "" -#: includes/class.cooked-settings.php:362 +#: includes/class.cooked-settings.php:374 msgid "Author Name Format" msgstr "" -#: includes/class.cooked-settings.php:363 +#: includes/class.cooked-settings.php:375 msgid "You can show the full author's name or just a part of it." msgstr "" -#: includes/class.cooked-settings.php:369 +#: includes/class.cooked-settings.php:381 msgid "Full name" msgstr "" -#: includes/class.cooked-settings.php:370 +#: includes/class.cooked-settings.php:382 msgid "Full first name w/last name initial" msgstr "" -#: includes/class.cooked-settings.php:371 +#: includes/class.cooked-settings.php:383 msgid "First name initial w/full last name" msgstr "" -#: includes/class.cooked-settings.php:372 +#: includes/class.cooked-settings.php:384 msgid "First name only" msgstr "" -#: includes/class.cooked-settings.php:377 +#: includes/class.cooked-settings.php:389 msgid "Author Links" msgstr "" -#: includes/class.cooked-settings.php:378 +#: includes/class.cooked-settings.php:390 msgid "If you do not want the author names to link to the author recipe listings, you can disable them here." msgstr "" -#: includes/class.cooked-settings.php:378 +#: includes/class.cooked-settings.php:390 msgid "Note: Author links require the Browse/Search Recipes Page to be set up correctly to function properly." msgstr "" -#: includes/class.cooked-settings.php:385 +#: includes/class.cooked-settings.php:397 msgid "Disable Author Links" msgstr "" -#: includes/class.cooked-settings.php:390 +#: includes/class.cooked-settings.php:402 msgid "Default Category" msgstr "" #. translators: a description on how to set the default recipe category for the [cooked-browse] shortcode. -#: includes/class.cooked-settings.php:392 +#: includes/class.cooked-settings.php:404 #, php-format msgid "Optionally set the default recipe category for your %s shortcode display." msgstr "" -#: includes/class.cooked-settings.php:398 +#: includes/class.cooked-settings.php:410 msgid "Default Sort Order" msgstr "" #. translators: a description on how to set the default sort order for the [cooked-browse] shortcode. -#: includes/class.cooked-settings.php:400 +#: includes/class.cooked-settings.php:412 #, php-format msgid "Set the default sort order for your %s shortcode display." msgstr "" -#: includes/class.cooked-settings.php:406 +#: includes/class.cooked-settings.php:418 msgid "Newest First" msgstr "" -#: includes/class.cooked-settings.php:407 +#: includes/class.cooked-settings.php:419 msgid "Oldest First" msgstr "" -#: includes/class.cooked-settings.php:408 +#: includes/class.cooked-settings.php:420 msgid "Alphabetical" msgstr "" -#: includes/class.cooked-settings.php:409 +#: includes/class.cooked-settings.php:421 msgid "Alphabetical (reversed)" msgstr "" -#: includes/class.cooked-settings.php:414 +#: includes/class.cooked-settings.php:426 msgid "Section Heading Default HTML Tag" msgstr "" #. translators: a description on how to set the default sort order for the [cooked-browse] shortcode. -#: includes/class.cooked-settings.php:416 +#: includes/class.cooked-settings.php:428 msgid "Set the default HTML tag for your section headings." msgstr "" -#: includes/class.cooked-settings.php:422 +#: includes/class.cooked-settings.php:434 msgid "div" msgstr "" -#: includes/class.cooked-settings.php:423 +#: includes/class.cooked-settings.php:435 msgid "h2" msgstr "" -#: includes/class.cooked-settings.php:424 +#: includes/class.cooked-settings.php:436 msgid "h3" msgstr "" -#: includes/class.cooked-settings.php:425 +#: includes/class.cooked-settings.php:437 msgid "h4" msgstr "" -#: includes/class.cooked-settings.php:426 +#: includes/class.cooked-settings.php:438 msgid "h5" msgstr "" -#: includes/class.cooked-settings.php:427 +#: includes/class.cooked-settings.php:439 msgid "h6" msgstr "" -#: includes/class.cooked-settings.php:432 +#: includes/class.cooked-settings.php:444 msgid "WP Editor Roles" msgstr "" -#: includes/class.cooked-settings.php:433 +#: includes/class.cooked-settings.php:445 msgid "Choose which user roles can use the WP Editor for the Excerpt, Directions & Notes fields." msgstr "" -#: includes/class.cooked-settings.php:439 +#: includes/class.cooked-settings.php:451 msgid "Advanced Settings" msgstr "" #. translators: an option to only show recipes with the [cooked-recipe] shortcode. -#: includes/class.cooked-settings.php:449 +#: includes/class.cooked-settings.php:461 msgid "Disable Public Recipes" msgstr "" #. translators: an option to only show recipes with the [cooked-recipe] shortcode. -#: includes/class.cooked-settings.php:449 +#: includes/class.cooked-settings.php:461 #, php-format msgid "Only show recipes using the %s shortcode." msgstr "" #. translators: an option to disable "meta" tags. -#: includes/class.cooked-settings.php:451 +#: includes/class.cooked-settings.php:463 #, php-format msgid "Disable %s Tags" msgstr "" #. translators: an option to disable "meta" tags. -#: includes/class.cooked-settings.php:451 +#: includes/class.cooked-settings.php:463 msgid "Prevents duplicates when tags already exist." msgstr "" -#: includes/class.cooked-settings.php:452 +#: includes/class.cooked-settings.php:464 msgid "Disable \"Servings Switcher\"" msgstr "" -#: includes/class.cooked-settings.php:452 +#: includes/class.cooked-settings.php:464 msgid "Removes the servings dropdown on recipes." msgstr "" -#: includes/class.cooked-settings.php:453 +#: includes/class.cooked-settings.php:465 msgid "Enable \"Measurement System Switcher\"" msgstr "" -#: includes/class.cooked-settings.php:453 +#: includes/class.cooked-settings.php:465 msgid "Shows the Metric/Imperial toggle on recipes." msgstr "" -#: includes/class.cooked-settings.php:454 +#: includes/class.cooked-settings.php:466 msgid "Disable Recipe Schema Output" msgstr "" -#: includes/class.cooked-settings.php:454 +#: includes/class.cooked-settings.php:466 msgid "You should only do this if you're using something else to output schema information." msgstr "" -#: includes/class.cooked-settings.php:455 +#: includes/class.cooked-settings.php:467 msgid "Disable Recipe Archive Page" msgstr "" #. translators: %s: recipe archive URL, e.g. https://example.com/recipe-archive -#: includes/class.cooked-settings.php:457 +#: includes/class.cooked-settings.php:469 #, php-format msgid "Prevents the recipe archive from being displayed at %s." msgstr "" -#: includes/class.cooked-settings.php:466 +#: includes/class.cooked-settings.php:478 msgid "Design" msgstr "" -#: includes/class.cooked-settings.php:470 +#: includes/class.cooked-settings.php:482 msgid "Dark Mode" msgstr "" -#: includes/class.cooked-settings.php:473 +#: includes/class.cooked-settings.php:485 msgid "Use Auto if your theme has a visitor dark mode toggle. Cooked will then match that choice. Otherwise leave this Off." msgstr "" -#: includes/class.cooked-settings.php:480 +#: includes/class.cooked-settings.php:492 msgid "Off" msgstr "" -#: includes/class.cooked-settings.php:481 +#: includes/class.cooked-settings.php:493 msgid "On" msgstr "" -#: includes/class.cooked-settings.php:482 +#: includes/class.cooked-settings.php:494 msgid "Auto (match theme dark mode)" msgstr "" -#: includes/class.cooked-settings.php:487 +#: includes/class.cooked-settings.php:499 msgid "Author Images" msgstr "" -#: includes/class.cooked-settings.php:488 +#: includes/class.cooked-settings.php:500 msgid "If you do not want to display the author images (avatars), you can disable them here." msgstr "" -#: includes/class.cooked-settings.php:495 +#: includes/class.cooked-settings.php:507 msgid "Hide Author Images" msgstr "" -#: includes/class.cooked-settings.php:500 +#: includes/class.cooked-settings.php:512 msgid "Default Recipe Image" msgstr "" -#: includes/class.cooked-settings.php:501 +#: includes/class.cooked-settings.php:513 msgid "Used as the featured image for recipes that do not have one set." msgstr "" -#: includes/class.cooked-settings.php:506 +#: includes/class.cooked-settings.php:518 msgid "Main Color" msgstr "" -#: includes/class.cooked-settings.php:507 +#: includes/class.cooked-settings.php:519 msgid "Used on buttons, cooking timer, etc." msgstr "" -#: includes/class.cooked-settings.php:513 +#: includes/class.cooked-settings.php:525 msgid "Main Color (on hover)" msgstr "" -#: includes/class.cooked-settings.php:514 +#: includes/class.cooked-settings.php:526 msgid "Used when hovering over buttons." msgstr "" -#: includes/class.cooked-settings.php:520 +#: includes/class.cooked-settings.php:532 msgid "First Responsive Breakpoint" msgstr "" -#: includes/class.cooked-settings.php:521 +#: includes/class.cooked-settings.php:533 msgid "Set the first responsive breakpoint. Best for large tablets." msgstr "" -#: includes/class.cooked-settings.php:527 +#: includes/class.cooked-settings.php:539 msgid "Second Responsive Breakpoint" msgstr "" -#: includes/class.cooked-settings.php:528 +#: includes/class.cooked-settings.php:540 msgid "Set the second responsive breakpoint. Best for small tablets." msgstr "" -#: includes/class.cooked-settings.php:534 +#: includes/class.cooked-settings.php:546 msgid "Third Responsive Breakpoint" msgstr "" -#: includes/class.cooked-settings.php:535 +#: includes/class.cooked-settings.php:547 msgid "Set the third responsive breakpoint. Best for phones and other small devices." msgstr "" -#: includes/class.cooked-settings.php:543 +#: includes/class.cooked-settings.php:555 msgid "Permalinks" msgstr "" -#: includes/class.cooked-settings.php:547 +#: includes/class.cooked-settings.php:559 msgid "Recipe Permalink" msgstr "" -#: includes/class.cooked-settings.php:550 +#: includes/class.cooked-settings.php:562 msgid "recipe-name" msgstr "" -#: includes/class.cooked-settings.php:554 +#: includes/class.cooked-settings.php:566 msgid "Recipe Author Permalink" msgstr "" -#: includes/class.cooked-settings.php:557 +#: includes/class.cooked-settings.php:569 msgid "author-name" msgstr "" -#: includes/class.cooked-settings.php:561 +#: includes/class.cooked-settings.php:573 msgid "Recipe Category Permalink" msgstr "" -#: includes/class.cooked-settings.php:564 +#: includes/class.cooked-settings.php:576 msgid "recipe-category-name" msgstr "" #. translators: posts_per_page default -#: includes/class.cooked-settings.php:575 +#: includes/class.cooked-settings.php:587 #, php-format msgid "WordPress Default %s" msgstr "" -#: includes/class.cooked-settings.php:580 +#: includes/class.cooked-settings.php:592 msgid "Show All (no pagination)" msgstr "" -#: includes/class.cooked-settings.php:724 +#: includes/class.cooked-settings.php:736 msgid "Begin Migration" msgstr "" #. translators: referring to the bottom of the Settings page. -#: includes/class.cooked-shortcodes.php:167 +#: includes/class.cooked-shortcodes.php:168 #, php-format msgid "Public recipes are currently disabled. You can change this at the bottom of the %s page." msgstr "" -#: includes/class.cooked-shortcodes.php:328 +#: includes/class.cooked-shortcodes.php:331 msgid "(recipe not found or in draft status)" msgstr "" -#: includes/class.cooked-shortcodes.php:359 +#. translators: %s: recipe embed shortcode +#: includes/class.cooked-shortcodes.php:363 #, php-format msgid "This recipe could not be displayed because it is set up to include itself (containing shortcode %s). Remove the duplicate recipe embed from the Recipe Template." msgstr "" -#: includes/class.cooked-shortcodes.php:723 +#: includes/class.cooked-shortcodes.php:727 msgid "Fullscreen" msgstr "" -#: includes/class.cooked-shortcodes.php:1175 +#: includes/class.cooked-shortcodes.php:1179 msgid "Invalid recipe ID specified. Please provide a valid numeric recipe ID." msgstr "" -#: includes/class.cooked-shortcodes.php:1185 +#: includes/class.cooked-shortcodes.php:1189 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:1192 +#: includes/class.cooked-shortcodes.php:1196 msgid "Recipe not found." msgstr "" -#: includes/class.cooked-shortcodes.php:1196 +#. translators: %d: post ID +#: includes/class.cooked-shortcodes.php:1201 #, php-format msgid "The specified ID (%d) is not a recipe." msgstr "" -#: includes/class.cooked-shortcodes.php:1198 +#. translators: %d: post ID +#: includes/class.cooked-shortcodes.php:1204 #, php-format msgid "No post found with ID %d." msgstr "" -#: includes/class.cooked-shortcodes.php:1207 +#: includes/class.cooked-shortcodes.php:1213 msgid "No related recipes found." msgstr "" -#: includes/class.cooked-shortcodes.php:1210 +#: includes/class.cooked-shortcodes.php:1216 msgid "This may be because there are no other recipes in the current language with matching attributes." msgstr "" -#: includes/class.cooked-shortcodes.php:1212 +#: includes/class.cooked-shortcodes.php:1218 msgid "Try adjusting the matching criteria or ensure you have other published recipes with shared categories, tags, or ingredients." msgstr "" @@ -2688,48 +2712,50 @@ msgid_plural "%s Recipes" msgstr[0] "" msgstr[1] "" -#: includes/class.cooked-updates.php:150 +#: includes/class.cooked-updates.php:167 msgid "Flush rewrite rules" msgstr "" -#: includes/class.cooked-updates.php:151 +#: includes/class.cooked-updates.php:168 msgid "Refreshes permalink rules for recipe and profile URLs." msgstr "" -#: includes/class.cooked-updates.php:154 +#: includes/class.cooked-updates.php:171 msgid "Fix recipe line endings" msgstr "" -#: includes/class.cooked-updates.php:155 +#: includes/class.cooked-updates.php:172 msgid "Normalizes line endings in recipe content for exporter/importer compatibility." msgstr "" -#: includes/class.cooked-updates.php:158 +#: includes/class.cooked-updates.php:175 msgid "Purge legacy related recipes cache" msgstr "" -#: includes/class.cooked-updates.php:159 +#: includes/class.cooked-updates.php:176 msgid "Removes old transients and options from the previous related-recipes cache." msgstr "" -#: includes/class.cooked-updates.php:162 +#: includes/class.cooked-updates.php:179 msgid "Remove recipes from user meta" msgstr "" -#: includes/class.cooked-updates.php:163 +#: includes/class.cooked-updates.php:180 msgid "Removes the legacy \"recipes\" key from all users' cooked_user_meta." msgstr "" -#: includes/class.cooked-updates.php:196 +#: includes/class.cooked-updates.php:213 msgid "Tool name is required." msgstr "" -#: includes/class.cooked-updates.php:207 +#. translators: %s: site health tool name +#: includes/class.cooked-updates.php:225 #, php-format msgid "Unknown tool: %s." msgstr "" -#: includes/class.cooked-updates.php:210 +#. translators: %s: PHP method name +#: includes/class.cooked-updates.php:229 #, php-format msgid "Tool method %s does not exist." msgstr "" @@ -2947,6 +2973,7 @@ msgstr "" msgid "Thanks for using %s!" msgstr "" +#. translators: 1: plugin name, 2: Settings link, 3: documentation link, 4: Discord link #: templates/admin/welcome.php:16 #, php-format msgid "If this is your first time using %1$s, head over to the %2$s page for some initial configuration. You can also check out the %3$s if you get stuck or contact me on %4$s. If you just recently updated, you can find out what's new below." diff --git a/package.json b/package.json index 66f88a2..407b674 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cooked", - "version": "1.16.0", + "version": "1.16.1", "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", "engines": { @@ -20,13 +20,20 @@ "destroy:ddev": "ddev delete -O && rm -rf wordpress && rm -rf .ddev", "init:ddev": "if [ -f wordpress/wp-load.php ]; then echo 'DDEV project is already initialized. Use \"run launch:ddev\" to start it or \"run destroy:ddev\" then \"run init:ddev\" to start fresh.'; exit 0; fi && ddev config --project-type=wordpress --project-name=cooked --php-version=7.4 --docroot=wordpress && printf 'services:\\n web:\\n volumes:\\n - ../:/var/www/html/wordpress/wp-content/plugins/cooked:rw\\n' > .ddev/docker-compose.cooked.yaml && mkdir -p wordpress/wp-content/plugins && ddev start && ddev wp core download && ddev wp core install --url=cooked.ddev.site --title=Cooked --admin_user=admin --admin_password=password --admin_email=admin@example.com && ddev wp plugin activate cooked && echo \"Admin username: admin, Admin password: password\" && echo \"Admin URL: cooked.ddev.site/wp-admin/\"", "launch:ddev": "ddev launch wp-admin/", - "i18n:make-pot": "if [ -d .ddev ]; then ddev wp i18n make-pot wordpress/wp-content/plugins/cooked/ wordpress/wp-content/plugins/cooked/languages/cooked.pot; else wp-env run cli wp i18n make-pot wp-content/plugins/cooked/ wp-content/plugins/cooked/languages/cooked.pot; fi", - "i18n:update-po": "if [ -d .ddev ]; then ddev wp i18n update-po wordpress/wp-content/plugins/cooked/languages/cooked.pot wordpress/wp-content/plugins/cooked/languages/cooked.po; else wp-env run cli wp i18n update-po wp-content/plugins/cooked/languages/cooked.pot wp-content/plugins/cooked/languages/cooked.po; fi", - "i18n:make-mo": "if [ -d .ddev ]; then ddev wp i18n make-mo wordpress/wp-content/plugins/cooked/languages/cooked.po wordpress/wp-content/plugins/cooked/languages/cooked.mo; else wp-env run cli wp i18n make-mo wp-content/plugins/cooked/languages/cooked.po wp-content/plugins/cooked/languages/cooked.mo; fi", - "i18n": "bun run i18n:make-pot && bun run i18n:update-po && bun run i18n:make-mo", + "i18n:make-pot": "if [ -d .ddev ]; then ddev wp i18n make-pot wordpress/wp-content/plugins/cooked/ wordpress/wp-content/plugins/cooked/languages/cooked.pot; elif [ -d ../../../.ddev ]; then ddev wp i18n make-pot /var/www/html/wp-content/plugins/cooked/ /var/www/html/wp-content/plugins/cooked/languages/cooked.pot; else wp-env run cli wp i18n make-pot wp-content/plugins/cooked/ wp-content/plugins/cooked/languages/cooked.pot; fi", + "i18n:update-po": "if [ -d .ddev ]; then ddev wp i18n update-po wordpress/wp-content/plugins/cooked/languages/cooked.pot wordpress/wp-content/plugins/cooked/languages/; elif [ -d ../../../.ddev ]; then ddev wp i18n update-po /var/www/html/wp-content/plugins/cooked/languages/cooked.pot /var/www/html/wp-content/plugins/cooked/languages/; else wp-env run cli wp i18n update-po wp-content/plugins/cooked/languages/cooked.pot wp-content/plugins/cooked/languages/; fi", + "i18n:apply-fr": "python3 bin/fix-fr-translations.py", + "i18n:make-mo": "if [ -d .ddev ]; then ddev wp i18n make-mo wordpress/wp-content/plugins/cooked/languages/; elif [ -d ../../../.ddev ]; then ddev wp i18n make-mo /var/www/html/wp-content/plugins/cooked/languages/; else wp-env run cli wp i18n make-mo wp-content/plugins/cooked/languages/; fi", + "i18n": "bun run i18n:make-pot && bun run i18n:update-po && bun run i18n:apply-fr && bun run i18n:make-mo", "lint": "./vendor/bin/phpcs --standard=phpcs.xml .", "lint-fix": "./vendor/bin/phpcbf --standard=phpcs.xml .", "test:php": "./vendor/bin/phpunit", + "test:e2e:install": "bunx playwright install chromium", + "test:e2e": "bunx playwright test --config tests/playwright/playwright.config.ts", + "test:e2e:a11y": "bunx playwright test --config tests/playwright/playwright.config.ts tests/playwright/tests/accessibility", + "test:visual": "backstop test --config=tests/backstop/backstop.config.js", + "test:visual:ref": "backstop reference --config=tests/backstop/backstop.config.js", + "test:visual:approve": "backstop approve --config=tests/backstop/backstop.config.js", "icons:embed": "bun scripts/embed-icons-font.js", "bundle": "bun run gulp build && bun run i18n && composer install --no-dev && bunx bestzip build/cooked.zip cooked.php LICENSE readme.txt wpml-config.xml assets/ includes/ languages/ sample-data/ templates/ vendor/" }, @@ -54,17 +61,20 @@ }, "homepage": "https://github.com/XjSv/Cooked#readme", "devDependencies": { - "@playwright/test": "^1.62.1", - "@types/node": "^26.2.0", - "@wordpress/e2e-test-utils-playwright": "^1.52.0", + "@axe-core/playwright": "^4.13.0", + "@playwright/test": "^1.63.0", + "@types/node": "^26.4.1", + "@wordpress/e2e-test-utils-playwright": "^1.54.0", + "@wordpress/env": "^11.14.0", + "backstopjs": "^6.3.25", + "bestzip": "^3.0.3", + "dotenv": "^17.4.2", "gulp": "^5.0.1", "gulp-clean-css": "^4.3.0", "gulp-rename": "^2.1.0", "gulp-sass": "^6.0.1", "gulp-uglify": "^3.0.2", - "playwright": "^1.62.1", - "sass": "^1.102.0", - "@wordpress/env": "^11.12.0", - "bestzip": "^3.0.2" + "playwright": "^1.63.0", + "sass": "^1.104.0" } } diff --git a/readme.md b/readme.md index 545952f..f447c23 100644 --- a/readme.md +++ b/readme.md @@ -92,12 +92,18 @@ bun run destroy:ddev # remove env and wordpress/ #### Generating language files Run with wp-env or DDEV started. The script detects which environment you use. + +Add or change French strings in `bin/fix_fr_translations_data.py`, then: + ``` bash -bun run i18n # make .pot, update .po, compile .mo +bun run i18n # make .pot, update all .po files, apply French, compile .mo bun run i18n:make-pot # generate cooked.pot only -bun run i18n:update-po # update .po from .pot -bun run i18n:make-mo # compile .po to .mo +bun run i18n:update-po # update all .po files in languages/ from the .pot +bun run i18n:apply-fr # copy French from the data file into cooked-fr_FR.po +bun run i18n:make-mo # compile all .po files in languages/ to .mo ``` + +`bun run i18n` prints any French strings still empty after applying the data file (`MISSING:`). Add those msgids to the data file and run `i18n` again. #### Compiling assets (JS/CSS) ``` bash bun run build # one-off build diff --git a/readme.txt b/readme.txt index 359755a..3e6a70a 100644 --- a/readme.txt +++ b/readme.txt @@ -1,9 +1,9 @@ === Cooked - Recipe Management === Contributors: xjsv, boxystudio Tags: recipe, recipes, food, cooking, nutrition -Requires at least: 5.0.0 -Tested up to: 7.0 -Stable tag: 1.16.0 +Requires at least: 6.8 +Tested up to: 7.1 +Stable tag: 1.16.1 Requires PHP: 7.4 License: GPLv2 or later License URI: https://www.gnu.org/licenses/gpl-2.0.html @@ -81,10 +81,19 @@ Please report security bugs found in the source code of the Cooked plugin throug == Upgrade Notice == -Version 1.16.0 adds video clips to recipe direction steps, Off/On/Auto Dark Mode, a default recipe image option, and other improvements. +Version 1.16.1 fixes recipe editor bugs, a security issue, and Plugin Check issues. == Changelog == += 1.16.1 = +* **FIX:** Fixed the 'Bulk Add' direction functionality when adding a [cooked-timer] or quotes. +* **TWEAK:** Removed the scroll to top when clicking recipe edit tabs. +* **FIX:** Fixed an encoding issue with SEO Description field. +* **FIX:** Fixed a bug with recipe edit tabs on screens under 1440px. +* **FIX:** Fixed the fullscreen mode not displaying correctly on WYSIWYG fields when in recipe edit. +* **FIX:** Fixed Contributor+ IDOR/CSRF on recipe migrate and import AJAX reported in Patchstack. +* **FIX:** Various Plugin Check (PCP) fixes. + = 1.16.0 = * **NEW:** Added video clips to recipe direction steps. Attach a video to any direction step using the WordPress Media Library, with square preview thumbnails in the admin and 16:9 responsive video output on the frontend. * **TWEAK:** Responsive admin layout improvements. diff --git a/templates/admin/import.php b/templates/admin/import.php index acf87a2..b946f21 100644 --- a/templates/admin/import.php +++ b/templates/admin/import.php @@ -3,7 +3,7 @@
-    +   
' : ''; - echo ''; + echo ''; echo !$notitle ? '

' . wp_kses_post( $field['title'] ) . '

' : ''; echo isset($field['desc']) && $field['desc'] ? '

' . wp_kses_post( $field['desc'] ). '

' : ''; $Cooked_Import->$field_type( $name, $field_options, $color, $field ); @@ -109,7 +109,7 @@ var vm = new Vue({ el: '#cooked-settings-panel', data: { - + } }); diff --git a/templates/admin/pro.php b/templates/admin/pro.php index aab14ec..f000ef9 100644 --- a/templates/admin/pro.php +++ b/templates/admin/pro.php @@ -2,16 +2,16 @@
- +

@@ -20,36 +20,36 @@
    -
  • -
  • -
  • -
  • -
  • +
  • +
  • +
  • +
  • +
    -
  • -
  • -
  • -
  • -
  • -
  • +
  • +
  • +
  • +
  • +
  • +
    -
  • -
  • -
  • -
  • -
  • +
  • +
  • +
  • +
  • +
COOKED10', '10%' ); + echo wp_kses_post( sprintf( __( 'Use coupon code %1$s for %2$s off!', 'cooked' ), 'COOKED10', '10%' ) ); ?>
diff --git a/templates/admin/settings.php b/templates/admin/settings.php index 8afe9be..9b6410b 100644 --- a/templates/admin/settings.php +++ b/templates/admin/settings.php @@ -7,7 +7,7 @@
-    +   
' : '' ); - echo ''; + echo ''; echo ( !$notitle ? '

' . wp_kses_post( $field['title'] ) . '

' : '' ); echo ( isset($field['desc']) && $field['desc'] ? '

' . wp_kses_post( $field['desc'] ). '

' : '' ); $Cooked_Settings->$field_type( $name, $field_options, $color, $field ); @@ -114,7 +114,7 @@ var vm = new Vue({ el: '#cooked-settings-panel', data: { - + } }); diff --git a/templates/admin/welcome.php b/templates/admin/welcome.php index 48d1393..84e1327 100644 --- a/templates/admin/welcome.php +++ b/templates/admin/welcome.php @@ -2,42 +2,42 @@
- +
-

+

    -
  •   
  • -
  •   
  • -
  •   
  • -
  •   
  • -
  •   
  • +
  •   
  • +
  •   
  • +
  •   
  • +
  •   
  • +
  •   
- +
diff --git a/templates/front/recipe-list.php b/templates/front/recipe-list.php index 88b1763..45b2dd6 100644 --- a/templates/front/recipe-list.php +++ b/templates/front/recipe-list.php @@ -32,11 +32,11 @@ $hide_avatars = ( isset( $_cooked_settings['hide_author_avatars'][0] ) && $_cooked_settings['hide_author_avatars'][0] == 'hidden' ? true : false ); echo '
'; - echo ( isset($author['profile_photo']) && $author['profile_photo'] ? ( !$hide_avatars ? '' . esc_html( $author['profile_photo'] ) . '' : '' ) : '' ); + echo ( isset($author['profile_photo']) && $author['profile_photo'] ? ( !$hide_avatars ? '' . wp_kses_post( $author['profile_photo'] ) . '' : '' ) : '' ); /* translators: referring to the author (ex: Recipes by John Smith) */ - echo '' . sprintf( __('Recipes by %s','cooked'), $author['name'] ) . ''; + echo '' . sprintf( esc_html__('Recipes by %s','cooked'), esc_html( $author['name'] ) ) . ''; $browse_page_id = Cooked_Multilingual::get_browse_page_id(); - echo ( $browse_page_id ? '
' . __( 'View all recipes','cooked' ) . '' : '' ); + echo ( $browse_page_id ? '
' . esc_html__( 'View all recipes','cooked' ) . '' : '' ); echo '
'; elseif ( $atts['search'] === 'true' ): @@ -97,7 +97,7 @@ echo '
'; if ( $atts['pagination'] === 'true' ): - echo Cooked_Recipes::pagination( $recipes['raw'], $recipe_args ); + echo wp_kses_post( Cooked_Recipes::pagination( $recipes['raw'], $recipe_args ) ); endif; wp_enqueue_script( 'cooked-appear' ); diff --git a/templates/front/recipe-print.php b/templates/front/recipe-print.php index 1918362..e09ba3d 100644 --- a/templates/front/recipe-print.php +++ b/templates/front/recipe-print.php @@ -27,7 +27,7 @@ function cooked_print_enqueues() { Cooked_Functions::print_options(); echo '

' . esc_html( get_the_title() ) . '

'; -echo wpautop( do_shortcode( Cooked_Recipes::print_content() ) ); +echo wp_kses_post( wpautop( do_shortcode( Cooked_Recipes::print_content() ) ) ); Cooked_Functions::print_options_js(); diff --git a/templates/front/recipe-single.php b/templates/front/recipe-single.php index 8000431..ec340cf 100644 --- a/templates/front/recipe-single.php +++ b/templates/front/recipe-single.php @@ -16,13 +16,13 @@ $recipe_classes = []; } -echo '
'; +echo '
'; do_action( 'cooked_recipe_grid_before_recipe', $recipe ); do_action( 'cooked_recipe_grid_before_image', $recipe ); - echo has_post_thumbnail( $recipe['id'] ) ? '' : ''; + echo has_post_thumbnail( $recipe['id'] ) ? '' : ''; do_action( 'cooked_recipe_grid_after_image', $recipe ); @@ -44,7 +44,7 @@ echo ''; $author = $recipe['author']; /* translators: referring to the author (ex: By John Smith) */ - echo sprintf( __( 'By %s', 'cooked' ), '' . $author['name'] . '' ); + echo wp_kses_post( sprintf( __( 'By %s', 'cooked' ), '' . esc_html( $author['name'] ) . '' ) ); echo ''; endif; diff --git a/templates/front/recipe.php b/templates/front/recipe.php index 65c99a9..139a3f8 100644 --- a/templates/front/recipe.php +++ b/templates/front/recipe.php @@ -30,10 +30,12 @@ global $wp_embed; $recipe_content = $wp_embed->autoembed( $recipe_content ); $recipe_content .= Cooked_Recipes::get_fsm_markup( $recipe_id, $recipe_settings ); - - $recipe_content .= isset($recipe_seo_content) ? $recipe_seo_content : ''; else: $recipe_content = strip_shortcodes( $recipe_content ); endif; -echo apply_filters( 'cooked_recipe_content', $recipe_content, $recipe_id ); +echo wp_kses_post( apply_filters( 'cooked_recipe_content', $recipe_content, $recipe_id ) ); + +if ( ! empty( $recipe_seo_content ) ) { + echo $recipe_seo_content; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- JSON-LD from wp_json_encode. +} diff --git a/tests/backstop/.gitignore b/tests/backstop/.gitignore new file mode 100644 index 0000000..25d5a9d --- /dev/null +++ b/tests/backstop/.gitignore @@ -0,0 +1,4 @@ +backstop_data/bitmaps_test/ +backstop_data/html_report/ +backstop_data/ci_report/ +backstop_data/json_report/ diff --git a/tests/phpunit/AjaxTest.php b/tests/phpunit/AjaxTest.php new file mode 100644 index 0000000..30ef2dd --- /dev/null +++ b/tests/phpunit/AjaxTest.php @@ -0,0 +1,96 @@ +setAccessible( true ); + return $ref->invoke( null, ...$args ); + } + + public function test_recipe_ids_from_json_returns_empty_for_invalid() { + $this->assertSame( [], self::call_private_method( 'recipe_ids_from_json', [ '' ] ) ); + $this->assertSame( [], self::call_private_method( 'recipe_ids_from_json', [ 'not-json' ] ) ); + $this->assertSame( [], self::call_private_method( 'recipe_ids_from_json', [ '{}' ] ) ); + $this->assertSame( [], self::call_private_method( 'recipe_ids_from_json', [ '[]' ] ) ); + } + + public function test_recipe_ids_from_json_absint_and_drops_zero() { + $this->assertSame( + [ 11, 12 ], + self::call_private_method( 'recipe_ids_from_json', [ '[11, 0, "12", "abc"]' ] ) + ); + } + + public function test_user_can_edit_post_of_type_allows_matching_recipe() { + $this->assertTrue( self::call_private_method( 'user_can_edit_post_of_type', [ 5, 'cp_recipe' ] ) ); + } + + public function test_user_can_edit_post_of_type_rejects_page() { + $GLOBALS['_cooked_test_posts'][11] = (object) [ + 'ID' => 11, + 'post_type' => 'page', + 'post_title' => 'Victim Page', + 'post_excerpt' => 'excerpt', + 'post_author' => 1, + 'post_status' => 'publish', + 'post_name' => 'victim-page', + 'post_content' => 'body', + ]; + + $this->assertFalse( self::call_private_method( 'user_can_edit_post_of_type', [ 11, 'cp_recipe' ] ) ); + } + + public function test_user_can_edit_post_of_type_rejects_wrong_import_source() { + $GLOBALS['_cooked_test_posts'][22] = (object) [ + 'ID' => 22, + 'post_type' => 'page', + 'post_title' => 'Private Page', + 'post_excerpt' => 'secret', + 'post_author' => 1, + 'post_status' => 'private', + 'post_name' => 'private-page', + 'post_content' => 'secret body', + ]; + + $this->assertFalse( self::call_private_method( 'user_can_edit_post_of_type', [ 22, 'recipe' ] ) ); + $this->assertFalse( self::call_private_method( 'user_can_edit_post_of_type', [ 22, 'wprm_recipe' ] ) ); + } + + public function test_user_can_edit_post_of_type_allows_matching_import_source() { + $GLOBALS['_cooked_test_posts'][33] = (object) [ + 'ID' => 33, + 'post_type' => 'recipe', + 'post_title' => 'Delicious Recipe', + 'post_excerpt' => '', + 'post_author' => 1, + 'post_status' => 'publish', + 'post_name' => 'delicious-recipe', + 'post_content' => '', + ]; + + $this->assertTrue( self::call_private_method( 'user_can_edit_post_of_type', [ 33, 'recipe' ] ) ); + } + + public function test_user_can_edit_post_of_type_rejects_when_cannot_edit_post() { + $GLOBALS['_cooked_test_current_user_can'] = function( $capability, ...$args ) { + if ( 'edit_post' === $capability ) { + return false; + } + return true; + }; + + $this->assertFalse( self::call_private_method( 'user_can_edit_post_of_type', [ 5, 'cp_recipe' ] ) ); + } + + public function test_user_can_edit_post_of_type_rejects_empty_type() { + $this->assertFalse( self::call_private_method( 'user_can_edit_post_of_type', [ 5, '' ] ) ); + } +} diff --git a/tests/phpunit/ColorsCssTest.php b/tests/phpunit/ColorsCssTest.php new file mode 100644 index 0000000..7b4b2fb --- /dev/null +++ b/tests/phpunit/ColorsCssTest.php @@ -0,0 +1,22 @@ +assertNotFalse( $src ); + + preg_match_all( "/\\\$dm\\(\\s*'([^']*)'\\s*\\)/", $src, $matches ); + $this->assertNotEmpty( $matches[1] ); + + foreach ( $matches[1] as $selectors ) { + $this->assertStringNotContainsString( + '>', + $selectors, + 'Child combinators must stay outside $dm() so wp_kses does not encode them.' + ); + } + } +} diff --git a/tests/phpunit/FilterTestCase.php b/tests/phpunit/FilterTestCase.php new file mode 100644 index 0000000..12a17f1 --- /dev/null +++ b/tests/phpunit/FilterTestCase.php @@ -0,0 +1,107 @@ +ob_level = ob_get_level(); + $this->reset_filter_test_state(); + } + + protected function tearDown(): void { + $this->reset_filter_test_state(); + while ( ob_get_level() > $this->ob_level ) { + ob_end_clean(); + } + parent::tearDown(); + } + + protected function reset_filter_test_state() { + $GLOBALS['_cooked_test_filters'] = []; + $GLOBALS['_cooked_test_actions'] = []; + $GLOBALS['_cooked_test_post_meta'] = []; + $GLOBALS['_cooked_test_posts'] = []; + $GLOBALS['_cooked_test_titles'] = []; + $GLOBALS['_cooked_test_query_vars'] = []; + $GLOBALS['_cooked_test_query_posts'] = []; + $GLOBALS['_cooked_test_terms'] = []; + $GLOBALS['_cooked_test_updated_posts'] = []; + $GLOBALS['_cooked_test_inserted_posts'] = []; + $GLOBALS['_cooked_test_attachment_image_calls'] = []; + $GLOBALS['_cooked_test_localized'] = []; + $GLOBALS['_cooked_test_inline_scripts'] = []; + $GLOBALS['_cooked_test_registered_post_types'] = []; + $GLOBALS['_cooked_test_registered_widgets'] = []; + $GLOBALS['_cooked_test_registered_roles'] = []; + $GLOBALS['_cooked_test_registered_taxonomies'] = []; + $GLOBALS['_cooked_test_meta_boxes'] = []; + $GLOBALS['_cooked_test_paginate_args'] = null; + $GLOBALS['_cooked_test_last_query'] = []; + $GLOBALS['_cooked_test_object_terms'] = []; + $GLOBALS['_cooked_test_max_num_pages'] = null; + $GLOBALS['_cooked_test_options'] = []; + $_GET = []; + $_POST = []; + unset( $GLOBALS['_cooked_test_attachment_image_html'] ); + unset( $GLOBALS['_cooked_test_is_admin'] ); + unset( $GLOBALS['_cooked_test_is_singular'] ); + unset( $GLOBALS['_cooked_test_is_feed'] ); + unset( $GLOBALS['_cooked_test_is_page'] ); + unset( $GLOBALS['_cooked_test_logged_in'] ); + unset( $GLOBALS['cooked_modified_where'] ); + unset( $GLOBALS['wp_rewrite'] ); + $GLOBALS['_cooked_settings'] = []; + $GLOBALS['_cooked_test_flush_rewrite_count'] = 0; + $GLOBALS['_cooked_test_flush_rewrite_hard'] = []; + if ( class_exists( 'Cooked_Updates' ) ) { + Cooked_Updates::reset_rewrite_flush_state(); + } + } + + protected function with_filter( $tag, $callback, $run, $accepted_args = 10 ) { + add_filter( $tag, $callback, 10, $accepted_args ); + try { + return $run(); + } finally { + remove_filter( $tag, $callback ); + } + } + + protected function capture_output( $run ) { + ob_start(); + try { + $run(); + return ob_get_clean(); + } catch ( \Throwable $e ) { + ob_end_clean(); + throw $e; + } + } + + protected function list_view_atts( $overrides = [] ) { + return array_merge( + [ + 'category' => false, + 'order' => false, + 'orderby' => false, + 'show' => 9, + 'search' => 'true', + 'pagination' => 'true', + 'columns' => 3, + 'layout' => false, + 'author' => false, + 'compact' => false, + 'hide_browse' => false, + 'hide_sorting' => false, + 'exclude' => false, + 'inline_browse' => false, + 'hide_excerpt' => false, + ], + $overrides + ); + } +} diff --git a/tests/phpunit/FotoramaAssetsTest.php b/tests/phpunit/FotoramaAssetsTest.php new file mode 100644 index 0000000..4acf9a7 --- /dev/null +++ b/tests/phpunit/FotoramaAssetsTest.php @@ -0,0 +1,17 @@ +assertFileExists( $dir . 'fotorama-2x.png' ); + $this->assertFileDoesNotExist( $dir . 'fotorama@2x.png' ); + + $css = file_get_contents( $dir . 'fotorama.min.css' ); + $this->assertStringContainsString( 'fotorama-2x.png', $css ); + $this->assertStringNotContainsString( 'fotorama@2x', $css ); + } +} diff --git a/tests/phpunit/MeasurementsFiltersTest.php b/tests/phpunit/MeasurementsFiltersTest.php new file mode 100644 index 0000000..8dd58a3 --- /dev/null +++ b/tests/phpunit/MeasurementsFiltersTest.php @@ -0,0 +1,107 @@ +with_filter( + 'cooked_measurements', + function ( $value ) { + $value['pinch'] = [ + 'singular_abbr' => 'pinch', + 'plural_abbr' => 'pinches', + 'singular' => 'pinch', + 'plural' => 'pinches', + 'system' => 'imperial', + 'variations' => [ 'pinch', 'pinches' ], + ]; + return $value; + }, + function () { + return Cooked_Measurements::get(); + } + ); + + $this->assertArrayHasKey( 'pinch', $measurements ); + $this->assertSame( 'pinches', Cooked_Measurements::singular_plural( $measurements['pinch']['singular'], $measurements['pinch']['plural'], 3 ) ); + } + + public function test_cooked_nutrition_facts_can_add_a_nutrient() { + $facts = $this->with_filter( + 'cooked_nutrition_facts', + function ( $value ) { + $value['bottom']['omega3'] = [ + 'name' => 'Omega-3', + 'type' => 'number', + 'measurement' => 'g', + 'pdv' => 1, + ]; + return $value; + }, + function () { + return Cooked_Measurements::nutrition_facts(); + } + ); + + $this->assertArrayHasKey( 'omega3', $facts['bottom'] ); + $this->assertSame( 'Omega-3', $facts['bottom']['omega3']['name'] ); + } + + /** + * @dataProvider pdv_filter_provider + */ + public function test_cooked_pdv_filters_change_daily_values( $hook, $section, $key, $subkey ) { + $facts = $this->with_filter( + $hook, + function () { + return 12345; + }, + function () { + return Cooked_Measurements::nutrition_facts(); + } + ); + + if ( $subkey ) { + $this->assertSame( 12345, $facts[ $section ][ $key ]['subs'][ $subkey ]['pdv'] ); + } else { + $this->assertSame( 12345, $facts[ $section ][ $key ]['pdv'] ); + } + } + + public function pdv_filter_provider() { + return [ + 'fat' => [ 'cooked_pdv_fat', 'main', 'fat', null ], + 'satfat' => [ 'cooked_pdv_satfat', 'main', 'fat', 'sat_fat' ], + 'cholesterol' => [ 'cooked_pdv_cholesterol', 'main', 'cholesterol', null ], + 'sodium' => [ 'cooked_pdv_sodium', 'main', 'sodium', null ], + 'carbs' => [ 'cooked_pdv_carbs', 'main', 'carbs', null ], + 'fiber' => [ 'cooked_pdv_fiber', 'main', 'carbs', 'fiber' ], + 'added_sugars' => [ 'cooked_pdv_added_sugars', 'main', 'carbs', 'added_sugars' ], + 'vitamin_a' => [ 'cooked_pdv_vitamin_a', 'bottom', 'vitamin_a', null ], + 'vitamin_c' => [ 'cooked_pdv_vitamin_c', 'bottom', 'vitamin_c', null ], + 'calcium' => [ 'cooked_pdv_calcium', 'bottom', 'calcium', null ], + 'iron' => [ 'cooked_pdv_iron', 'bottom', 'iron', null ], + 'potassium' => [ 'cooked_pdv_potassium', 'bottom', 'potassium', null ], + 'vitamin_d' => [ 'cooked_pdv_vitamin_d', 'bottom', 'vitamin_d', null ], + 'vitamin_e' => [ 'cooked_pdv_vitamin_e', 'bottom', 'vitamin_e', null ], + 'vitamin_k' => [ 'cooked_pdv_vitamin_k', 'bottom', 'vitamin_k', null ], + 'thiamin' => [ 'cooked_pdv_thiamin', 'bottom', 'thiamin', null ], + 'riboflavin' => [ 'cooked_pdv_riboflavin', 'bottom', 'riboflavin', null ], + 'niacin' => [ 'cooked_pdv_niacin', 'bottom', 'niacin', null ], + 'vitamin_b6' => [ 'cooked_pdv_vitamin_b6', 'bottom', 'vitamin_b6', null ], + 'folate' => [ 'cooked_pdv_folate', 'bottom', 'folate', null ], + 'vitamin_b12' => [ 'cooked_pdv_vitamin_b12', 'bottom', 'vitamin_b12', null ], + 'biotin' => [ 'cooked_pdv_biotin', 'bottom', 'biotin', null ], + 'pantothenic_acid' => [ 'cooked_pdv_pantothenic_acid', 'bottom', 'pantothenic_acid', null ], + 'phosphorus' => [ 'cooked_pdv_phosphorus', 'bottom', 'phosphorus', null ], + 'iodine' => [ 'cooked_pdv_iodine', 'bottom', 'iodine', null ], + 'magnesium' => [ 'cooked_pdv_magnesium', 'bottom', 'magnesium', null ], + 'zinc' => [ 'cooked_pdv_zinc', 'bottom', 'zinc', null ], + 'selenium' => [ 'cooked_pdv_selenium', 'bottom', 'selenium', null ], + 'copper' => [ 'cooked_pdv_copper', 'bottom', 'copper', null ], + 'manganese' => [ 'cooked_pdv_manganese', 'bottom', 'manganese', null ], + 'chromium' => [ 'cooked_pdv_chromium', 'bottom', 'chromium', null ], + 'molybdenum' => [ 'cooked_pdv_molybdenum', 'bottom', 'molybdenum', null ], + 'chloride' => [ 'cooked_pdv_chloride', 'bottom', 'chloride', null ], + ]; + } +} diff --git a/tests/phpunit/PluginApiFiltersTest.php b/tests/phpunit/PluginApiFiltersTest.php new file mode 100644 index 0000000..bc3c19a --- /dev/null +++ b/tests/phpunit/PluginApiFiltersTest.php @@ -0,0 +1,584 @@ + 1, + 'post_title' => 'Test Recipe', + 'post_excerpt' => '', + 'post_author' => 1, + 'post_status' => 'publish', + 'post_type' => 'cp_recipe', + ]; + } + + public function test_cooked_schema_html_can_replace_json_ld() { + $html = $this->with_filter( + 'cooked_schema_html', + function () { + return ''; + }, + function () { + return Cooked_SEO::json_ld( + [ + 'id' => 1, + 'title' => 'Test Recipe', + 'ingredients' => [], + 'directions' => [], + 'nutrition' => [ 'servings' => 1 ], + ] + ); + } + ); + + $this->assertStringContainsString( '{"filtered":true}', $html ); + } + + public function test_cooked_schema_array_can_add_a_key() { + $schema = $this->with_filter( + 'cooked_schema_array', + function ( $value ) { + $value['filtered'] = 'yes'; + return $value; + }, + function () { + return Cooked_SEO::schema_values( + [ + 'id' => 1, + 'title' => 'Test Recipe', + 'ingredients' => [], + 'directions' => [], + 'nutrition' => [ 'servings' => 1 ], + ] + ); + } + ); + + $this->assertSame( 'yes', $schema['filtered'] ); + $this->assertSame( 'Recipe', $schema['@type'] ); + } + + public function test_cooked_format_author_name_can_replace_name() { + $name = $this->with_filter( + 'cooked_format_author_name', + function () { + return 'Filtered Author'; + }, + function () { + return Cooked_Users::format_author_name( 'John Doe', 'full' ); + } + ); + + $this->assertSame( 'Filtered Author', $name ); + } + + public function test_cooked_format_author_name_safe_array_skips_escaping() { + $name = $this->with_filter( + 'cooked_format_author_name', + function () { + return [ 'Safe', true ]; + }, + function () { + return Cooked_Users::format_author_name( 'John Doe', 'full' ); + } + ); + + $this->assertSame( 'Safe', $name ); + } + + public function test_cooked_recipe_editor_caps_reach_add_role() { + $this->with_filter( + 'cooked_recipe_editor_caps', + function ( $caps ) { + $caps['filtered_cap'] = 1; + return $caps; + }, + function () { + Cooked_Roles::add_roles(); + } + ); + + $this->assertSame( + 1, + $GLOBALS['_cooked_test_registered_roles']['cooked_recipe_editor']['caps']['filtered_cap'] + ); + } + + public function test_cooked_taxonomy_settings_can_change_slug() { + $taxonomies = $this->with_filter( + 'cooked_taxonomy_settings', + function ( $value ) { + $value['cp_recipe_category'] = 'filtered-category'; + return $value; + }, + function () { + return Cooked_Taxonomies::get(); + } + ); + + $this->assertSame( 'filtered-category', $taxonomies['cp_recipe_category']['rewrite']['slug'] ); + } + + public function test_cooked_taxonomies_can_add_a_taxonomy() { + $taxonomies = $this->with_filter( + 'cooked_taxonomies', + function ( $value ) { + $value['cp_recipe_sentinel'] = [ 'labels' => [ 'name' => 'Sentinel' ] ]; + return $value; + }, + function () { + return Cooked_Taxonomies::get(); + } + ); + + $this->assertArrayHasKey( 'cp_recipe_sentinel', $taxonomies ); + } + + public function test_cooked_taxonomy_settings_update_writes_filtered_permalink() { + $GLOBALS['_cooked_test_is_admin'] = true; + $_GET['settings-updated'] = 'true'; + $_GET['page'] = 'cooked_settings'; + $GLOBALS['_cooked_test_options']['cooked_settings'] = [ + 'recipe_permalink' => 'recipes', + 'recipe_author_permalink' => 'recipe-author', + 'recipe_category_permalink' => 'recipe-category', + ]; + + $this->with_filter( + 'cooked_taxonomy_settings_update', + function ( $value ) { + $value['recipe_permalink'] = 'filtered-recipes'; + return $value; + }, + function () { + Cooked_Post_Types::init(); + } + ); + + $this->assertSame( + 'filtered-recipes', + $GLOBALS['_cooked_test_options']['cooked_settings']['recipe_permalink'] + ); + } + + public function test_cooked_post_types_can_add_a_type() { + $types = $this->with_filter( + 'cooked_post_types', + function ( $value ) { + $value['cp_recipe_extra'] = [ 'labels' => [ 'name' => 'Extra' ] ]; + return $value; + }, + function () { + return Cooked_Post_Types::get(); + } + ); + + $this->assertArrayHasKey( 'cp_recipe_extra', $types ); + } + + public function test_cooked_widgets_can_add_a_widget() { + $widgets = new Cooked_Widgets(); + $this->with_filter( + 'cooked_widgets', + function ( $value ) { + $value[] = 'Cooked_Widget_Sentinel'; + return $value; + }, + function () use ( $widgets ) { + $widgets->register_widgets(); + } + ); + + $this->assertContains( 'Cooked_Widget_Sentinel', $GLOBALS['_cooked_test_registered_widgets'] ); + } + + public function test_cooked_can_show_recipe_hides_card_widget() { + $widget = new Cooked_Widget_Recipe_Card(); + $args = [ + 'before_widget' => '
', + 'after_widget' => '
', + 'before_title' => '

', + 'after_title' => '

', + ]; + + $hidden = $this->with_filter( + 'cooked_can_show_recipe', + function () { + return false; + }, + function () use ( $widget, $args ) { + return $this->capture_output( + function () use ( $widget, $args ) { + $widget->widget( $args, [ 'recipe_id' => 1, 'title' => 'Card' ] ); + } + ); + } + ); + + $this->assertSame( '', $hidden ); + + $shown = $this->capture_output( + function () use ( $widget, $args ) { + $widget->widget( $args, [ 'recipe_id' => 1, 'title' => 'Card' ] ); + } + ); + + $this->assertStringContainsString( '
', $shown ); + } + + public function test_cooked_allergens_can_add_an_allergen() { + $allergens = $this->with_filter( + 'cooked_allergens', + function ( $value ) { + $value['sentinel'] = [ + 'label' => 'Sentinel Allergen', + 'icon' => 'allergen-sentinel', + ]; + return $value; + }, + function () { + return Cooked_Allergens::get_allergens(); + } + ); + + $this->assertArrayHasKey( 'sentinel', $allergens ); + $this->assertSame( 'Sentinel Allergen', $allergens['sentinel']['label'] ); + } + + public function test_cooked_recipe_card_allergen_hooks_can_add_a_hook() { + $hooks = $this->with_filter( + 'cooked_recipe_card_allergen_hooks', + function ( $value ) { + $value[] = 'cooked_sentinel_allergen_hook'; + return $value; + }, + function () { + return Cooked_Allergens::get_recipe_card_hooks(); + } + ); + + $this->assertContains( 'cooked_sentinel_allergen_hook', $hooks ); + } + + public function test_cooked_import_tabs_fields_can_add_a_tab() { + $tabs = $this->with_filter( + 'cooked_import_tabs_fields', + function ( $value ) { + $value['sentinel'] = [ 'name' => 'Sentinel Import' ]; + return $value; + }, + function () { + return Cooked_Import::tabs_fields(); + } + ); + + $this->assertArrayHasKey( 'sentinel', $tabs ); + $this->assertSame( 'Sentinel Import', $tabs['sentinel']['name'] ); + } + + public function test_cp_recipe_metabox_post_types_registers_meta_box() { + $meta = new Cooked_Recipe_Meta(); + + $this->with_filter( + 'cp_recipe_metabox_post_types', + function () { + return [ 'cp_recipe', 'page' ]; + }, + function () use ( $meta ) { + $meta->add_recipe_meta_box( 'page' ); + } + ); + + $screens = array_column( $GLOBALS['_cooked_test_meta_boxes'], 'screen' ); + $this->assertContains( 'page', $screens ); + } + + public function test_cooked_recipe_metabox_post_types_registers_meta_box() { + $meta = new Cooked_Recipe_Meta(); + + $this->with_filter( + 'cooked_recipe_metabox_post_types', + function () { + return [ 'cp_recipe', 'page' ]; + }, + function () use ( $meta ) { + $meta->add_recipe_meta_box( 'page' ); + } + ); + + $screens = array_column( $GLOBALS['_cooked_test_meta_boxes'], 'screen' ); + $this->assertContains( 'page', $screens ); + } + + public function test_cooked_recipe_admin_tabs_can_add_a_tab() { + $GLOBALS['_cooked_test_post_meta'][1]['_recipe_settings'] = [ + 'cooked_version' => COOKED_VERSION, + 'ingredients' => [], + ]; + + $html = $this->with_filter( + 'cooked_recipe_admin_tabs', + function ( $tabs ) { + $tabs['sentinel'] = [ + 'icon' => 'star', + 'name' => 'Sentinel Tab', + 'conditional' => false, + 'value' => false, + ]; + return $tabs; + }, + function () { + return $this->capture_output( + function () { + cooked_render_recipe_fields( 1 ); + } + ); + } + ); + + $this->assertStringContainsString( 'Sentinel Tab', $html ); + } + + public function test_cooked_ingredient_field_classes_appear_in_meta() { + $GLOBALS['_cooked_test_post_meta'][1]['_recipe_settings'] = [ + 'cooked_version' => COOKED_VERSION, + 'ingredients' => [ + [ 'amount' => '1', 'measurement' => 'cup', 'name' => 'Flour' ], + ], + ]; + + $html = $this->with_filter( + 'cooked_ingredient_field_classes', + function ( $classes ) { + return $classes . ' filtered-ingredient'; + }, + function () { + return $this->capture_output( + function () { + cooked_render_recipe_fields( 1 ); + } + ); + } + ); + + $this->assertStringContainsString( 'filtered-ingredient', $html ); + } + + public function test_cooked_available_info_vars_appear_in_shortcodes_tab() { + $GLOBALS['_cooked_test_post_meta'][1]['_recipe_settings'] = [ + 'cooked_version' => COOKED_VERSION, + ]; + + $html = $this->with_filter( + 'cooked_available_info_vars', + function ( $vars ) { + $vars['sentinel'] = 'Sentinel Var'; + return $vars; + }, + function () { + return $this->capture_output( + function () { + cooked_render_recipe_fields( 1 ); + } + ); + } + ); + + $this->assertStringContainsString( 'sentinel', $html ); + $this->assertStringContainsString( 'Sentinel Var', $html ); + } + + public function test_cooked_seo_recipe_content_and_should_update_on_meta_save() { + $_POST['cooked_recipe_custom_box_nonce'] = 'test_nonce'; + $_POST['_recipe_settings'] = [ + 'excerpt' => 'Saved excerpt', + 'title' => 'Saved', + ]; + + $meta = new Cooked_Recipe_Meta(); + + $this->with_filter( + 'cooked_seo_recipe_content', + function () { + return 'FILTERED_SEO_CONTENT'; + }, + function () use ( $meta ) { + $this->with_filter( + 'cooked_should_update_post_content', + function () { + return true; + }, + function () use ( $meta ) { + $meta->save_recipe_meta_box( 7 ); + } + ); + } + ); + + $last = end( $GLOBALS['_cooked_test_updated_posts'] ); + $this->assertSame( 'FILTERED_SEO_CONTENT', $last['post_content'] ); + $this->assertSame( 7, $last['ID'] ); + + $GLOBALS['_cooked_test_updated_posts'] = []; + $this->with_filter( + 'cooked_should_update_post_content', + function () { + return false; + }, + function () use ( $meta ) { + $meta->save_recipe_meta_box( 8 ); + } + ); + + $last = end( $GLOBALS['_cooked_test_updated_posts'] ); + $this->assertArrayNotHasKey( 'post_content', $last ); + $this->assertSame( 8, $last['ID'] ); + } + + public function test_cooked_seo_recipe_content_and_should_update_on_csv_import() { + $this->with_filter( + 'cooked_seo_recipe_content', + function () { + return 'CSV_FILTERED_SEO'; + }, + function () { + Cooked_CSV_Import::import_recipe( + [ + 'title' => 'Imported Recipe', + 'excerpt' => 'Imported excerpt', + ] + ); + } + ); + + $last = end( $GLOBALS['_cooked_test_updated_posts'] ); + $this->assertSame( 'CSV_FILTERED_SEO', $last['post_content'] ); + + $GLOBALS['_cooked_test_updated_posts'] = []; + $this->with_filter( + 'cooked_should_update_post_content', + function () { + return false; + }, + function () { + Cooked_CSV_Import::import_recipe( + [ + 'title' => 'Imported Recipe Two', + 'excerpt' => 'Excerpt', + ] + ); + } + ); + + $last = end( $GLOBALS['_cooked_test_updated_posts'] ); + $this->assertArrayNotHasKey( 'post_content', $last ); + } + + public function test_cooked_timer_sound_mp3_is_localized() { + $enqueues = new Cooked_Enqueues(); + $this->with_filter( + 'cooked_timer_sound_mp3', + function () { + return 'http://example.com/filtered-ding.mp3'; + }, + function () use ( $enqueues ) { + $enqueues->enqueues( '' ); + } + ); + + $found = false; + foreach ( $GLOBALS['_cooked_test_inline_scripts'] as $script ) { + if ( false !== strpos( $script['data'], 'filtered-ding.mp3' ) ) { + $found = true; + break; + } + } + $this->assertTrue( $found ); + } + + public function test_cooked_whats_new_title_appears_in_changelog() { + $html = $this->with_filter( + 'cooked_whats_new_title', + function () { + return 'Filtered Whats New'; + }, + function () { + return Cooked_Functions::parse_readme_changelog(); + } + ); + + $this->assertStringContainsString( 'Filtered Whats New', $html ); + } + + public function test_cooked_default_print_options_check_a_box() { + $html = $this->with_filter( + 'cooked_default_print_options', + function ( $value ) { + $value['print_options_info'] = 'checked'; + return $value; + }, + function () { + return $this->capture_output( + function () { + Cooked_Functions::print_options(); + } + ); + } + ); + + $this->assertMatchesRegularExpression( + '/id="print_options_info"[^>]*checked/', + $html + ); + } + + public function test_cooked_version_updates_adds_a_runnable_tool() { + $tools = $this->with_filter( + 'cooked_version_updates', + function ( $updates ) { + $updates['99.0.0'] = [ 'sentinel_tool' ]; + return $updates; + }, + function () { + return Cooked_Updates::get_runnable_tools(); + } + ); + + $ids = array_column( $tools, 'id' ); + $this->assertContains( 'sentinel_tool', $ids ); + } +} diff --git a/tests/phpunit/RecipeMetaTest.php b/tests/phpunit/RecipeMetaTest.php index c87cc0e..3f72519 100644 --- a/tests/phpunit/RecipeMetaTest.php +++ b/tests/phpunit/RecipeMetaTest.php @@ -4,6 +4,12 @@ class RecipeMetaTest extends TestCase { + protected function tearDown(): void { + unset( $GLOBALS['_cooked_test_logged_in'] ); + unset( $GLOBALS['_cooked_settings'] ); + parent::tearDown(); + } + public function test_meta_cleanup_empty_input() { $result = Cooked_Recipe_Meta::meta_cleanup([]); $this->assertSame([], $result); @@ -65,4 +71,83 @@ public function test_meta_cleanup_sanitizes_direction_video_field() { $result = Cooked_Recipe_Meta::meta_cleanup($input); $this->assertStringNotContainsString('', imgOnerror: '', @@ -28,27 +26,10 @@ const XSS_PAYLOADS = { nestedScript: '</script>', }; -// Create a fixture for authentication -const test = base.extend({ - adminContext: async ({ browser }, use) => { - const context = await browser.newContext({ - storageState: getAuthPath('mtresova') - }); - const page = await context.newPage(); - await ensureValidAuth(page, 'mtresova', 'password'); - await use(context); - await page.close(); - await context.close(); - } -}); - test.describe('XSS Prevention Tests', () => { - // These tests verify that XSS payloads are properly sanitized on save or escaped on output - test('Recipe title should be escaped against XSS on output', async ({ adminContext }) => { const adminPage = await adminContext.newPage(); - - // Track if XSS is triggered via alert dialogs + let xssAlertTriggered = false; adminPage.on('dialog', async (dialog) => { if (dialog.message().includes('XSS')) { @@ -58,33 +39,25 @@ test.describe('XSS Prevention Tests', () => { }); await adminPage.goto('/wp-admin/post-new.php?post_type=cp_recipe', { waitUntil: 'networkidle' }); - + const xssTitle = 'Test XSS ' + XSS_PAYLOADS.scriptTag + ' ' + Date.now(); - - // Set recipe title with XSS payload + await adminPage.getByLabel('Recipe title ...').fill(xssTitle); - - // Set minimum required fields await adminPage.fill('input[name="_recipe_settings[prep_time]"]', '10'); - - // Publish the recipe await adminPage.getByRole('button', { name: 'Publish', exact: true }).click(); - + await Promise.all([ adminPage.waitForURL(/post\.php\?post=\d+&action=edit/), adminPage.waitForSelector('.notice-success', { timeout: 10000 }) ]); - - // Get the post ID from the URL + const url = adminPage.url(); const postIdMatch = url.match(/post=(\d+)/); postId = postIdMatch ? parseInt(postIdMatch[1]) : 0; expect(postId).toBeTruthy(); - - // View the recipe on the frontend + const frontendPage = await adminContext.newPage(); - - // Track XSS on frontend + let frontendXssTriggered = false; frontendPage.on('dialog', async (dialog) => { if (dialog.message().includes('XSS')) { @@ -92,26 +65,22 @@ test.describe('XSS Prevention Tests', () => { } await dialog.dismiss(); }); - + await frontendPage.goto('/?post_type=cp_recipe&p=' + postId, { waitUntil: 'networkidle' }); - - // Check that the XSS was not triggered via window variable or dialogs + const xssTriggeredOnPage = await frontendPage.evaluate(() => window.xssTriggered === true); - + expect(xssAlertTriggered).toBe(false); expect(frontendXssTriggered).toBe(false); expect(xssTriggeredOnPage).toBe(false); - - // Cleanup + await frontendPage.close(); - - // Delete the recipe - execSync(`wp post delete ${postId} --force`); + deletePost(postId); }); test('Recipe excerpt should be sanitized against XSS', async ({ adminContext }) => { const adminPage = await adminContext.newPage(); - + let xssAlertTriggered = false; adminPage.on('dialog', async (dialog) => { if (dialog.message().includes('XSS')) { @@ -121,37 +90,33 @@ test.describe('XSS Prevention Tests', () => { }); await adminPage.goto('/wp-admin/post-new.php?post_type=cp_recipe', { waitUntil: 'networkidle' }); - + const title = 'Test Recipe XSS Excerpt: ' + Date.now(); - - // Set recipe title + await adminPage.getByLabel('Recipe title ...').fill(title); await adminPage.fill('input[name="_recipe_settings[prep_time]"]', '10'); - - // Set excerpt with XSS payloads via TinyMCE + await adminPage.evaluate((payload) => { const excerptEditor = window.tinyMCE.get('_recipe_settings_excerpt'); if (excerptEditor) { excerptEditor.setContent(payload); } }, XSS_PAYLOADS.imgOnerror); - - // Publish the recipe + await adminPage.getByRole('button', { name: 'Publish', exact: true }).click(); - + await Promise.all([ adminPage.waitForURL(/post\.php\?post=\d+&action=edit/), adminPage.waitForSelector('.notice-success', { timeout: 10000 }) ]); - + const url = adminPage.url(); const postIdMatch = url.match(/post=(\d+)/); postId = postIdMatch ? parseInt(postIdMatch[1]) : 0; expect(postId).toBeTruthy(); - - // View the recipe on the frontend + const frontendPage = await adminContext.newPage(); - + let frontendXssTriggered = false; frontendPage.on('dialog', async (dialog) => { if (dialog.message().includes('XSS')) { @@ -159,27 +124,26 @@ test.describe('XSS Prevention Tests', () => { } await dialog.dismiss(); }); - + await frontendPage.goto('/?post_type=cp_recipe&p=' + postId, { waitUntil: 'networkidle' }); - + const xssTriggeredOnPage = await frontendPage.evaluate(() => window.xssTriggered === true); - + expect(xssAlertTriggered).toBe(false); expect(frontendXssTriggered).toBe(false); expect(xssTriggeredOnPage).toBe(false); - - // Verify onerror handler is not present + const pageContent = await frontendPage.content(); expect(pageContent).not.toContain('onerror="window.xssTriggered'); expect(pageContent).not.toContain("onerror='window.xssTriggered"); - + await frontendPage.close(); - execSync(`wp post delete ${postId} --force`); + deletePost(postId); }); test('Recipe notes should be sanitized against XSS', async ({ adminContext }) => { const adminPage = await adminContext.newPage(); - + let xssAlertTriggered = false; adminPage.on('dialog', async (dialog) => { if (dialog.message().includes('XSS')) { @@ -189,37 +153,33 @@ test.describe('XSS Prevention Tests', () => { }); await adminPage.goto('/wp-admin/post-new.php?post_type=cp_recipe', { waitUntil: 'networkidle' }); - + const title = 'Test Recipe XSS Notes: ' + Date.now(); - - // Set recipe title + await adminPage.getByLabel('Recipe title ...').fill(title); await adminPage.fill('input[name="_recipe_settings[prep_time]"]', '10'); - - // Set notes with SVG XSS payload via TinyMCE + await adminPage.evaluate((payload) => { const notesEditor = window.tinyMCE.get('_recipe_settings_notes'); if (notesEditor) { notesEditor.setContent(payload); } }, XSS_PAYLOADS.svgOnload); - - // Publish the recipe + await adminPage.getByRole('button', { name: 'Publish', exact: true }).click(); - + await Promise.all([ adminPage.waitForURL(/post\.php\?post=\d+&action=edit/), adminPage.waitForSelector('.notice-success', { timeout: 10000 }) ]); - + const url = adminPage.url(); const postIdMatch = url.match(/post=(\d+)/); postId = postIdMatch ? parseInt(postIdMatch[1]) : 0; expect(postId).toBeTruthy(); - - // View the recipe on the frontend + const frontendPage = await adminContext.newPage(); - + let frontendXssTriggered = false; frontendPage.on('dialog', async (dialog) => { if (dialog.message().includes('XSS')) { @@ -227,27 +187,26 @@ test.describe('XSS Prevention Tests', () => { } await dialog.dismiss(); }); - + await frontendPage.goto('/?post_type=cp_recipe&p=' + postId, { waitUntil: 'networkidle' }); - + const xssTriggeredOnPage = await frontendPage.evaluate(() => window.xssTriggered === true); - + expect(xssAlertTriggered).toBe(false); expect(frontendXssTriggered).toBe(false); expect(xssTriggeredOnPage).toBe(false); - - // Verify onload handler is not present + const pageContent = await frontendPage.content(); expect(pageContent).not.toContain('onload="window.xssTriggered'); expect(pageContent).not.toContain("onload='window.xssTriggered"); - + await frontendPage.close(); - execSync(`wp post delete ${postId} --force`); + deletePost(postId); }); test('Recipe directions should be sanitized against XSS', async ({ adminContext }) => { const adminPage = await adminContext.newPage(); - + let xssAlertTriggered = false; adminPage.on('dialog', async (dialog) => { if (dialog.message().includes('XSS')) { @@ -257,14 +216,12 @@ test.describe('XSS Prevention Tests', () => { }); await adminPage.goto('/wp-admin/post-new.php?post_type=cp_recipe', { waitUntil: 'networkidle' }); - + const title = 'Test Recipe XSS Directions: ' + Date.now(); - - // Set recipe title + await adminPage.getByLabel('Recipe title ...').fill(title); await adminPage.fill('input[name="_recipe_settings[prep_time]"]', '10'); - - // Set direction content with XSS payload + await adminPage.evaluate((payload) => { const directionEditors = Object.keys(window.tinyMCE.editors).filter(id => /^direction-\d+-content$/.test(id)); if (directionEditors.length > 0) { @@ -274,23 +231,21 @@ test.describe('XSS Prevention Tests', () => { } } }, XSS_PAYLOADS.eventHandler); - - // Publish the recipe + await adminPage.getByRole('button', { name: 'Publish', exact: true }).click(); - + await Promise.all([ adminPage.waitForURL(/post\.php\?post=\d+&action=edit/), adminPage.waitForSelector('.notice-success', { timeout: 10000 }) ]); - + const url = adminPage.url(); const postIdMatch = url.match(/post=(\d+)/); postId = postIdMatch ? parseInt(postIdMatch[1]) : 0; expect(postId).toBeTruthy(); - - // View the recipe on the frontend + const frontendPage = await adminContext.newPage(); - + let frontendXssTriggered = false; frontendPage.on('dialog', async (dialog) => { if (dialog.message().includes('XSS')) { @@ -298,27 +253,26 @@ test.describe('XSS Prevention Tests', () => { } await dialog.dismiss(); }); - + await frontendPage.goto('/?post_type=cp_recipe&p=' + postId, { waitUntil: 'networkidle' }); - + const xssTriggeredOnPage = await frontendPage.evaluate(() => window.xssTriggered === true); - + expect(xssAlertTriggered).toBe(false); expect(frontendXssTriggered).toBe(false); expect(xssTriggeredOnPage).toBe(false); - - // Verify onclick handler is not present + const pageContent = await frontendPage.content(); expect(pageContent).not.toContain('onclick="window.xssTriggered'); expect(pageContent).not.toContain("onclick='window.xssTriggered"); - + await frontendPage.close(); - execSync(`wp post delete ${postId} --force`); + deletePost(postId); }); test('Recipe ingredient names should be sanitized against XSS', async ({ adminContext }) => { const adminPage = await adminContext.newPage(); - + let xssAlertTriggered = false; adminPage.on('dialog', async (dialog) => { if (dialog.message().includes('XSS')) { @@ -328,42 +282,38 @@ test.describe('XSS Prevention Tests', () => { }); await adminPage.goto('/wp-admin/post-new.php?post_type=cp_recipe', { waitUntil: 'networkidle' }); - + const title = 'Test Recipe XSS Ingredients: ' + Date.now(); - - // Set recipe title + await adminPage.getByLabel('Recipe title ...').fill(title); await adminPage.fill('input[name="_recipe_settings[prep_time]"]', '10'); - - // Set ingredient with XSS payload + await adminPage.evaluate((payload) => { const ingredientBlocks = document.querySelectorAll('.cooked-ingredient-block'); if (ingredientBlocks.length > 0) { const firstIngredient = ingredientBlocks[0]; const amountInput = firstIngredient.querySelector('input[data-ingredient-part="amount"]') as HTMLInputElement; const itemInput = firstIngredient.querySelector('input[data-ingredient-part="name"]') as HTMLInputElement; - + if (amountInput) amountInput.value = '1'; if (itemInput) itemInput.value = payload; } }, XSS_PAYLOADS.scriptTag); - - // Publish the recipe + await adminPage.getByRole('button', { name: 'Publish', exact: true }).click(); - + await Promise.all([ adminPage.waitForURL(/post\.php\?post=\d+&action=edit/), adminPage.waitForSelector('.notice-success', { timeout: 10000 }) ]); - + const url = adminPage.url(); const postIdMatch = url.match(/post=(\d+)/); postId = postIdMatch ? parseInt(postIdMatch[1]) : 0; expect(postId).toBeTruthy(); - - // View the recipe on the frontend + const frontendPage = await adminContext.newPage(); - + let frontendXssTriggered = false; frontendPage.on('dialog', async (dialog) => { if (dialog.message().includes('XSS')) { @@ -371,26 +321,25 @@ test.describe('XSS Prevention Tests', () => { } await dialog.dismiss(); }); - + await frontendPage.goto('/?post_type=cp_recipe&p=' + postId, { waitUntil: 'networkidle' }); - + const xssTriggeredOnPage = await frontendPage.evaluate(() => window.xssTriggered === true); - + expect(xssAlertTriggered).toBe(false); expect(frontendXssTriggered).toBe(false); expect(xssTriggeredOnPage).toBe(false); - - // Verify the script tag is not present as executable + const pageContent = await frontendPage.content(); expect(pageContent).not.toContain('