mealz-injector 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,3 @@
1
+ !function(){"use strict";try{if("undefined"!=typeof document){var e=document.createElement("style");e.appendChild(document.createTextNode('@charset "UTF-8";:root .mealz-recipe-card.variant-2{--mealz-recipe-card-height: 330px}@media(max-width:1023px){:root .mealz-recipe-card.variant-2{--mealz-recipe-card-height: 264px}}:root .mealz-recipe-card.variant-2{--mealz-recipe-card-width: calc( 1660px / 6)}@media(max-width:2046px){:root .mealz-recipe-card.variant-2{--mealz-recipe-card-width: calc( calc(100vw - 404px) / 6)}}@media(max-width:1586px){:root .mealz-recipe-card.variant-2{--mealz-recipe-card-width: calc((100vw - 388px)/5) }}@media(max-width:1370px){:root .mealz-recipe-card.variant-2{--mealz-recipe-card-width: calc((100vw - 372px)/4) }}@media(max-width:1114px){:root .mealz-recipe-card.variant-2{--mealz-recipe-card-width: calc( calc(100vw - 356px) / 3)}}@media(max-width:1023px){:root .mealz-recipe-card.variant-2{--mealz-recipe-card-width: calc( calc(100vw - 340px) / 3)}}@media(max-width:850px){:root .mealz-recipe-card.variant-2{--mealz-recipe-card-width: calc( calc(100vw - 56px) / 3)}}@media(max-width:581px){:root .mealz-recipe-card.variant-2{--mealz-recipe-card-width: calc((100vw - 48px)/2) }}:root .mealz-recipe-card.variant-2{--mealz-bottom-height: 88px}:root .grid-tile .mealz-recipe-card{width:100%;height:100%}:root .grid-tile .mealz-recipe-card .mealz-recipe-card__container .mealz-recipe-card__bottom{border:0;padding:15px 15px 33px;height:initial}:root .grid-tile .mealz-recipe-card .mealz-recipe-card__container .mealz-recipe-card__bottom .mealz-recipe-card__actions .mealz-recipe-card__price{margin:-10px 0 0;position:relative}:root .grid-tile .mealz-recipe-card .mealz-recipe-card__container .mealz-recipe-card__bottom .mealz-recipe-card__actions .mealz-recipe-card__price .mealz-recipe-pricing .mealz-recipe-pricing__wrapper .mealz-recipe-pricing__wrapper__subline{margin-top:0;position:absolute;top:28px}@media(max-width:600px){:root .grid-tile .mealz-recipe-card.variant-2{height:200px}:root .grid-tile .mealz-recipe-card.variant-2 .mealz-recipe-card__container{flex-direction:row}:root .grid-tile .mealz-recipe-card.variant-2 .mealz-recipe-card__container .mealz-recipe-card__top{flex:none;height:100%;width:50%;position:static}:root .grid-tile .mealz-recipe-card.variant-2 .mealz-recipe-card__container .mealz-recipe-card__top .mealz-recipe-card__gradient{width:50%}:root .grid-tile .mealz-recipe-card.variant-2 .mealz-recipe-card__container .mealz-recipe-card__top .mealz-recipe-card__content .mealz-recipe-card__top-container:has(.mealz-recipe-card__sponsor-container){flex-direction:row}:root .grid-tile .mealz-recipe-card.variant-2 .mealz-recipe-card__container .mealz-recipe-card__top .mealz-recipe-card__content .mealz-recipe-card__top-container:has(.mealz-recipe-card__sponsor-container) .mealz-recipe-card_sponso_and_promo_badge .mealz-recipe-card__sponsor-container{position:absolute;bottom:12px;margin-bottom:0}:root .grid-tile .mealz-recipe-card.variant-2 .mealz-recipe-card__container .mealz-recipe-card__top .mealz-recipe-card__content .mealz-recipe-card__top-container:has(.mealz-recipe-card__sponsor-container) .mealz-recipe-card_sponso_and_promo_badge .mealz-recipe-card__sponsor-container .mealz-recipe-card__sponsor-picture{max-width:48px}:root .grid-tile .mealz-recipe-card.variant-2 .mealz-recipe-card__container .mealz-recipe-card__top .mealz-recipe-card__content .mealz-recipe-card__top-container .mealz-recipe-card__media-badges-column .mealz-recipe-promotion-badge{display:none}:root .grid-tile .mealz-recipe-card.variant-2 .mealz-recipe-card__container .mealz-recipe-card__top .mealz-recipe-card__content .mealz-recipe-card__picture__bottom{width:50%;justify-content:flex-end}:root .grid-tile .mealz-recipe-card.variant-2 .mealz-recipe-card__container .mealz-recipe-card__top .mealz-recipe-card__content .mealz-recipe-card__picture__bottom .mealz-recipe-card__title{width:calc(50% - 32px);position:absolute;top:12px;right:16px;text-shadow:none;color:var(--mealz-ds-color-neutral-black, #000)}:root .grid-tile .mealz-recipe-card.variant-2 .mealz-recipe-card__container .mealz-recipe-card__bottom{height:inherit;justify-content:flex-end;padding:15px 15px 18px}:root .grid-tile .mealz-recipe-card.variant-2 .mealz-recipe-card__container .mealz-recipe-card__bottom .mealz-recipe-card__actions{position:relative;gap:0;flex-wrap:wrap}:root .grid-tile .mealz-recipe-card.variant-2 .mealz-recipe-card__container .mealz-recipe-card__bottom .mealz-recipe-card__actions .mealz-recipe-card__infos .mealz-recipe-card__price-and-promotion .mealz-recipe-card__bottom-promotion{display:inherit;position:absolute;bottom:40px}:root .grid-tile .mealz-recipe-card.variant-2 .mealz-recipe-card__container .mealz-recipe-card__bottom .mealz-recipe-card__actions .mealz-recipe-card__infos .mealz-recipe-card__price-and-promotion .mealz-recipe-card__bottom-promotion .mealz-recipe-promotion-badge{align-items:center;padding:4px 8px;border-radius:4px;background-color:#e22019;gap:4px;margin-bottom:8px}:root .grid-tile .mealz-recipe-card.variant-2 .mealz-recipe-card__container .mealz-recipe-card__bottom .mealz-recipe-card__actions .mealz-recipe-card__infos .mealz-recipe-card__price-and-promotion .mealz-recipe-card__bottom-promotion .mealz-recipe-promotion-badge span{font-size:14px}:root .grid-tile .mealz-recipe-card.variant-2 .mealz-recipe-card__container .mealz-recipe-card__bottom .mealz-recipe-card__actions .mealz-recipe-card__infos .mealz-recipe-card__price-and-promotion .mealz-recipe-card__bottom-promotion .mealz-recipe-promotion-badge>*:not(:last-child){margin-right:4px}:root .grid-tile .mealz-recipe-card.variant-2 .mealz-recipe-card__container .mealz-recipe-card__bottom .mealz-recipe-card__actions .mealz-recipe-card__infos .mealz-recipe-card__price-and-promotion .mealz-recipe-card__price{flex-shrink:0}:root .grid-tile .mealz-recipe-card.variant-2 .mealz-recipe-card__container .mealz-recipe-card__bottom .mealz-recipe-card__actions .mealz-recipe-card__infos .mealz-recipe-card__price-and-promotion .mealz-recipe-card__price .mealz-recipe-pricing{max-width:inherit}:root .grid-tile .mealz-recipe-card.variant-2 .mealz-recipe-card__container .mealz-recipe-card__bottom .mealz-recipe-card__actions .mealz-recipe-card__infos .mealz-recipe-card__price-and-promotion .mealz-recipe-card__price .mealz-recipe-pricing .mealz-recipe-pricing__wrapper{flex-direction:column}:root .grid-tile .mealz-recipe-card.variant-2 .mealz-recipe-card__container .mealz-recipe-card__bottom .mealz-recipe-card__actions .mealz-recipe-card__cta{flex:1;justify-content:end}}:root .mealz-recipe-card .mealz-recipe-card__container .mealz-recipe-card__top .mealz-recipe-card__badge-container.food img.mealz-recipe-card__badge{content:url(https://storage.googleapis.com/assets.miam.tech/coursesu/images/1.47/recipe-card-badge.svg)}:root .mealz-recipe-card .mealz-recipe-card__container .mealz-recipe-card__top .mealz-recipe-card__badge-container.drink img.mealz-recipe-card__badge{content:url(https://storage.googleapis.com/assets.miam.tech/coursesu/images/1.47/recipe-card-badge-drinks.svg)}:root .mealz-recipe-card .mealz-recipe-card__container .mealz-recipe-card__top .mealz-recipe-card__content .mealz-recipe-card__picture__bottom .mealz-recipe-card__title{font-size:14px;font-weight:700}:root .mealz-recipe-card .mealz-recipe-card__container .mealz-recipe-card__top .mealz-recipe-card__content .mealz-recipe-card__picture__bottom .mealz-recipe-card__counter{color:var(--mealz-ds-color-neutral-black, #000)}:root .mealz-recipe-card .mealz-recipe-card__container .mealz-recipe-card__top .mealz-recipe-card__content .mealz-recipe-card__top-container .mealz-recipe-card__sponsor-container{padding:6px 8px;border-radius:4px}:root .mealz-recipe-card .mealz-recipe-card__container .mealz-recipe-card__top .mealz-recipe-card__content .mealz-recipe-card__top-container .mealz-recipe-card__sponsor-container .mealz-recipe-card__sponsor-picture{max-width:64px;max-height:32px}:root .mealz-recipe-card .mealz-recipe-card__container .mealz-recipe-card__top .mealz-recipe-card__content .mealz-recipe-card__top-container .mealz-recipe-card__media-badges-column .mealz-recipe-promotion-badge{padding:4px 8px;border-radius:4px;background-color:#e22019;gap:4px}:root .mealz-recipe-card .mealz-recipe-card__container .mealz-recipe-card__top .mealz-recipe-card__content .mealz-recipe-card__top-container .mealz-recipe-card__media-badges-column .mealz-recipe-promotion-badge span{font-size:14px}:root .mealz-recipe-card .mealz-recipe-card__container .mealz-recipe-card__top .mealz-recipe-card__content .mealz-recipe-card__top-container .mealz-recipe-card__like .mealz-like-button.mealz-ds-button.primary.reverse.square.small .mealz-like-button__icon{width:20px;height:20px}:root .mealz-recipe-card .mealz-recipe-card__container .mealz-recipe-card__bottom{padding:12px 15px}:root .mealz-recipe-card .mealz-recipe-card__container .mealz-recipe-card__bottom .mealz-recipe-card__actions .mealz-recipe-card__cta{gap:6px}@media(max-width:600px){:root .mealz-recipe-card .mealz-recipe-card__container .mealz-recipe-card__bottom .mealz-recipe-card__actions .mealz-recipe-card__cta{gap:12px}}:root .mealz-recipe-card .mealz-recipe-card__container .mealz-recipe-card__bottom .mealz-recipe-card__actions .mealz-recipe-card__cta mealz-recipe-card-cta .mealz-ds-button{border-radius:40px;padding:8px}:root .mealz-recipe-card .mealz-recipe-card__container .mealz-recipe-card__bottom .mealz-recipe-card__actions .mealz-recipe-card__cta mealz-recipe-card-cta .mealz-ds-button:not(.in-basket):before{content:"";height:24px;width:24px;background-image:url(https://storage.googleapis.com/assets.miam.tech/coursesu/icons/Cart.svg);background-size:contain}:root .mealz-recipe-card .mealz-recipe-card__container .mealz-recipe-card__bottom .mealz-recipe-card__actions .mealz-recipe-card__cta mealz-recipe-card-cta .mealz-ds-button.in-basket:before{content:"";height:24px;width:24px;background-image:url(https://storage.googleapis.com/assets.miam.tech/coursesu/icons/InCart_primary.svg);background-size:contain;background-position:center;background-repeat:no-repeat}:root .mealz-recipe-card .mealz-recipe-card__container .mealz-recipe-card__bottom .mealz-recipe-card__actions .mealz-recipe-card__cta mealz-recipe-card-cta .mealz-ds-button img{display:none}:root .mealz-recipe-card .mealz-recipe-card__container .mealz-recipe-card__bottom .mealz-recipe-card__actions .mealz-recipe-card__price{margin:0}:root .mealz-recipe-card .mealz-recipe-card__container .mealz-recipe-card__bottom .mealz-recipe-card__actions .mealz-recipe-card__price .mealz-recipe-pricing{max-width:72px}:root .mealz-recipe-card .mealz-recipe-card__container .mealz-recipe-card__bottom .mealz-recipe-card__actions .mealz-recipe-card__price .mealz-recipe-pricing .mealz-recipe-pricing__wrapper .mealz-recipe-pricing__wrapper__price{color:var(--mealz-ds-color-neutral-black, #000);font-weight:700}:root .mealz-recipe-card .mealz-recipe-card__container .mealz-recipe-card__bottom .mealz-recipe-card__actions .mealz-recipe-card__price .mealz-recipe-pricing .mealz-recipe-pricing__wrapper .mealz-recipe-pricing__wrapper__subline{font-family:Open Sans Regular,sans-serif;color:var(--mealz-ds-color-neutral-black, #000);opacity:.7;font-size:14px;font-weight:400}:root .mealz-recipe-card .mealz-recipe-card__container .mealz-recipe-card__redirect{border:unset;background:#d3daf6}:root .mealz-recipe-card .mealz-recipe-card__container .mealz-recipe-card__redirect img{content:url(https://storage.googleapis.com/assets.miam.tech/coursesu/images/Suggestion_Redirect_Background_Spring.png);margin:8px 0 -40px}:root .mealz-recipe-card .mealz-recipe-card__container .mealz-recipe-card__redirect .mealz-recipe-card__redirect__footer .mealz-recipe-card__redirect__title{font-weight:700;color:#000}:root .mealz-recipe-card .mealz-recipe-card__container .mealz-recipe-card__redirect .mealz-recipe-card__redirect__footer .mealz-recipe-card__redirect__button span{font-weight:600}@media(max-width:1023px){:root .mealz-recipe-card .mealz-recipe-card__container .mealz-recipe-card__redirect{flex-direction:column}:root .mealz-recipe-card .mealz-recipe-card__container .mealz-recipe-card__redirect img{content:url(https://storage.googleapis.com/assets.miam.tech/coursesu/images/Suggestion_Redirect_Background_Spring.png);height:100%;margin:8px 0 -40px}:root .mealz-recipe-card .mealz-recipe-card__container .mealz-recipe-card__redirect .mealz-recipe-card__redirect__footer{min-width:unset}:root .mealz-recipe-card .mealz-recipe-card__container .mealz-recipe-card__redirect .mealz-recipe-card__redirect__footer .mealz-recipe-card__redirect__title{font-weight:700;color:#000}}@media(max-width:600px){:root .mealz-recipe-card .mealz-recipe-card__container .mealz-recipe-card__redirect{flex-direction:row}:root .mealz-recipe-card .mealz-recipe-card__container .mealz-recipe-card__redirect img{content:url(https://storage.googleapis.com/assets.miam.tech/coursesu/images/Suggestion_Redirect_Background_Spring_Mobile.png);height:124%;margin:-22px -16px}:root .mealz-recipe-card .mealz-recipe-card__container .mealz-recipe-card__redirect .mealz-recipe-card__redirect__footer{min-width:148px}:root .mealz-recipe-card .mealz-recipe-card__container .mealz-recipe-card__redirect .mealz-recipe-card__redirect__footer .mealz-recipe-card__redirect__title{font-size:16px}:root .mealz-recipe-card .mealz-recipe-card__container .mealz-recipe-card__redirect .mealz-recipe-card__redirect__footer .mealz-recipe-card__redirect__button{padding:8px 16px}}:root .mealz-recipe-inspiration{width:100%;max-width:832px;padding-top:16px;margin-bottom:20px}@media(max-width:650px){:root .mealz-recipe-inspiration{margin-bottom:24px}}@media(max-width:1023px){:root .mealz-recipe-inspiration{display:none}}:root .mealz-recipe-inspiration .mealz-recipe-inspiration__title{font-weight:800;font-size:16px;line-height:24px;color:var(--mealz-ds-color-primary, #007d8f);padding:22px 0 8px;border-bottom:1px solid var(--mealz-ds-color-neutral-200, #D9DDE1)}@media(max-width:595px){:root .mealz-recipe-inspiration .mealz-recipe-inspiration__title{margin:0 8px}}:root .mealz-recipe-inspiration .mealz-recipe-inspiration__content{font-weight:400;font-size:16px;line-height:24px;padding:8px 0}@media(max-width:595px){:root .mealz-recipe-inspiration .mealz-recipe-inspiration__content{margin:0 8px}}:root .mealz-recipe-inspiration .mealz-recipe-inspiration__cards{display:flex}@media(max-width:650px){:root .mealz-recipe-inspiration .mealz-recipe-inspiration__cards{flex-direction:column}}:root .mealz-recipe-inspiration .mealz-recipe-inspiration__cards .mealz-recipe-card{margin:0 20px 20px;width:calc(100% - 40px)}@media(min-width:650px){:root .mealz-recipe-inspiration .mealz-recipe-inspiration__cards .mealz-recipe-card{width:300px;height:400px;margin:unset}}:root .mealz-recipe-inspiration .mealz-recipe-inspiration__cards .mealz-recipe-inspiration__more{position:relative;display:flex;flex-direction:column;justify-content:end;width:300px;height:400px;background-color:#005562;border-radius:10px;padding:24px;margin-left:20px;cursor:pointer}@media(max-width:650px){:root .mealz-recipe-inspiration .mealz-recipe-inspiration__cards .mealz-recipe-inspiration__more{margin-right:20px;width:calc(100% - 40px);height:170px}}:root .mealz-recipe-inspiration .mealz-recipe-inspiration__cards .mealz-recipe-inspiration__more img{position:absolute;width:300px;height:120.21px;left:0;top:126px}@media(max-width:650px){:root .mealz-recipe-inspiration .mealz-recipe-inspiration__cards .mealz-recipe-inspiration__more img{top:15px;left:50%;transform:translate(-50%)}}:root .mealz-recipe-inspiration .mealz-recipe-inspiration__cards .mealz-recipe-inspiration__more button{display:flex;flex-direction:row;justify-content:center;align-items:center;padding:9px 20px;border:1px solid #FFFFFF;border-radius:23px;background-color:transparent;color:#fff}:root .mealz-recipe-inspiration .mealz-recipe-inspiration__cards .mealz-recipe-inspiration__more:hover button{border-width:2px}@media(max-width:600px){:root .recipe-details .mealz-button-parent-card-container{display:none}}:root .mealz-button-parent-card-container .mealz-recipe-card-cta.mealz-ds-button{margin:auto;border-radius:100px;gap:8px;font-size:14px}:root .mealz-button-parent-card-container .mealz-recipe-card-cta.mealz-ds-button:not(.in-basket) img{content:url(https://storage.googleapis.com/assets.miam.tech/coursesu/icons/Cart.svg)}:root .mealz-button-parent-card-container .mealz-recipe-card-cta.mealz-ds-button.primary:not(.in-basket):before{content:"Commander les ingrédients"}:root .mealz-button-parent-card-container .mealz-recipe-card-cta.mealz-ds-button.in-basket img{content:url(https://storage.googleapis.com/assets.miam.tech/coursesu/icons/InCart_primary.svg)}:root .mealz-button-parent-card-container .mealz-recipe-card-cta.mealz-ds-button.in-basket:before{content:"Voir le détail"}:root .mealz-button-parent-card-container .mealz-recipe-card-cta.mealz-ds-button:hover:not(.loading):not(.disabled):not([disabled]){color:#fff;background-color:#005562;border-color:#005562}:root .entry--key-information .mealz-button-parent-card-container{margin-top:29px}:root .entry--key-information .mealz-button-parent-card-container .mealz-recipe-card-cta.mealz-ds-button.in-basket:before{content:"Voir le détail des produits"}:root .mealz-recipe-tag-container{position:absolute;left:130px}@media(max-width:1023px){:root .mealz-recipe-tag-container{left:112px}}:root .mealz-recipe-tag-container .mealz-recipe-tag{background:#ffc700;border:none!important;border-radius:5px!important;color:#000!important;font-family:Mulish,sans-serif;width:100px;justify-content:center;font-weight:700;padding:unset;position:absolute}:root .mealz-recipe-tag-container .mealz-recipe-tag.mealz-ds-badge{background:#ffc700}:root mealz-modal.mealz-recipe-tag__modal-root .mealz-modal .mealz-modal__header{background-color:#fff;border-radius:5px}:root mealz-modal.mealz-recipe-tag__modal-root .mealz-modal .mealz-recipe-tag__container__list .mealz-recipe-tag__list__badge{border:1px solid #D6D6D6;border-radius:3px;padding:4px}:root mealz-modal.mealz-recipe-tag__modal-root .mealz-modal .mealz-recipe-tag__container__list .mealz-recipe-tag__list__badge .mealz-recipe-tag__badge__icon{display:none}@media(max-width:1023px){:root mealz-modal.mealz-recipe-tag__modal-root .mealz-modal{top:unset;bottom:0;left:0;right:0;transform:unset;width:100vw;border-radius:20px 20px 0 0}:root mealz-modal.mealz-recipe-tag__modal-root .mealz-modal .mealz-modal__header .mealz-modal__close-icon{position:absolute;top:8px;right:10px;margin:0}:root mealz-modal.mealz-recipe-tag__modal-root .mealz-modal .mealz-recipe-tag__container__list{align-items:center}}:root{--mealz-gauge-background-color: #f3f6f6;--mealz-gauge-color: #66b1bc;--mealz-gauge-danger-color: #ec0000;--mealz-gauge-danger-background-color: #ffe7e0}:root .mealz-planner-entry-container{max-width:1780px}:root .mealz-planner-entry-container .mealz-to-basket-loader{position:fixed;top:24px;right:0;width:calc(100% - 267px);height:100%;z-index:50;background-color:#fff}:root .mealz-planner-entry__content{padding:24px 20px 0}:root .mealz-planner-entry__content[data-lang^=fr]{--coursesu-planner-entry-badge-image: url(https://storage.googleapis.com/assets.miam.tech/coursesu/icons/meals-planner/tag-new-fr.svg);--coursesu-planner-entry-title-desktop-image: url(https://storage.googleapis.com/assets.miam.tech/coursesu/icons/meals-planner/title-entry-fr.svg);--coursesu-planner-entry-title-mobile-image: url(https://storage.googleapis.com/assets.miam.tech/coursesu/icons/meals-planner/title-entry-mobile-fr.svg)}:root .mealz-planner-entry__content[data-lang^=en]{--coursesu-planner-entry-badge-image: url(https://storage.googleapis.com/assets.miam.tech/coursesu/icons/meals-planner/tag-new-en.svg);--coursesu-planner-entry-title-desktop-image: url(https://storage.googleapis.com/assets.miam.tech/coursesu/icons/meals-planner/title-entry-en.svg);--coursesu-planner-entry-title-mobile-image: url(https://storage.googleapis.com/assets.miam.tech/coursesu/icons/meals-planner/title-entry-mobile-en.svg)}:root .mealz-planner-entry__content[data-lang^=fr] .mealz-planner-entry__hero .mealz-planner-entry__hero-card .mealz-planner-entry__hero-left .mealz-planner-entry__hero-badge,:root .mealz-planner-entry__content[data-lang^=fr] .mealz-planner-entry__hero .mealz-planner-entry__hero-card .mealz-planner-entry__hero-left .mealz-planner-entry__hero-title,:root .mealz-planner-entry__content[data-lang^=en] .mealz-planner-entry__hero .mealz-planner-entry__hero-card .mealz-planner-entry__hero-left .mealz-planner-entry__hero-badge,:root .mealz-planner-entry__content[data-lang^=en] .mealz-planner-entry__hero .mealz-planner-entry__hero-card .mealz-planner-entry__hero-left .mealz-planner-entry__hero-title{position:relative}:root .mealz-planner-entry__content[data-lang^=fr] .mealz-planner-entry__hero .mealz-planner-entry__hero-card .mealz-planner-entry__hero-left .mealz-planner-entry__hero-badge img,:root .mealz-planner-entry__content[data-lang^=fr] .mealz-planner-entry__hero .mealz-planner-entry__hero-card .mealz-planner-entry__hero-left .mealz-planner-entry__hero-title img,:root .mealz-planner-entry__content[data-lang^=en] .mealz-planner-entry__hero .mealz-planner-entry__hero-card .mealz-planner-entry__hero-left .mealz-planner-entry__hero-badge img,:root .mealz-planner-entry__content[data-lang^=en] .mealz-planner-entry__hero .mealz-planner-entry__hero-card .mealz-planner-entry__hero-left .mealz-planner-entry__hero-title img{opacity:0}:root .mealz-planner-entry__content[data-lang^=fr] .mealz-planner-entry__hero .mealz-planner-entry__hero-card .mealz-planner-entry__hero-left .mealz-planner-entry__hero-badge:before,:root .mealz-planner-entry__content[data-lang^=fr] .mealz-planner-entry__hero .mealz-planner-entry__hero-card .mealz-planner-entry__hero-left .mealz-planner-entry__hero-title:before,:root .mealz-planner-entry__content[data-lang^=en] .mealz-planner-entry__hero .mealz-planner-entry__hero-card .mealz-planner-entry__hero-left .mealz-planner-entry__hero-badge:before,:root .mealz-planner-entry__content[data-lang^=en] .mealz-planner-entry__hero .mealz-planner-entry__hero-card .mealz-planner-entry__hero-left .mealz-planner-entry__hero-title:before{content:"";position:absolute;inset:0;pointer-events:none;background-position:center;background-repeat:no-repeat;background-size:contain}:root .mealz-planner-entry__content[data-lang^=fr] .mealz-planner-entry__hero .mealz-planner-entry__hero-card .mealz-planner-entry__hero-left .mealz-planner-entry__hero-badge:before,:root .mealz-planner-entry__content[data-lang^=en] .mealz-planner-entry__hero .mealz-planner-entry__hero-card .mealz-planner-entry__hero-left .mealz-planner-entry__hero-badge:before{background-image:var(--coursesu-planner-entry-badge-image)}:root .mealz-planner-entry__content[data-lang^=fr] .mealz-planner-entry__hero .mealz-planner-entry__hero-card .mealz-planner-entry__hero-left .mealz-planner-entry__hero-title:before,:root .mealz-planner-entry__content[data-lang^=en] .mealz-planner-entry__hero .mealz-planner-entry__hero-card .mealz-planner-entry__hero-left .mealz-planner-entry__hero-title:before{background-image:var(--coursesu-planner-entry-title-desktop-image)}@media(max-width:700px){:root .mealz-planner-entry__content[data-lang^=fr] .mealz-planner-entry__hero .mealz-planner-entry__hero-card .mealz-planner-entry__hero-left,:root .mealz-planner-entry__content[data-lang^=en] .mealz-planner-entry__hero .mealz-planner-entry__hero-card .mealz-planner-entry__hero-left{margin:8px 0}:root .mealz-planner-entry__content[data-lang^=fr] .mealz-planner-entry__hero .mealz-planner-entry__hero-card .mealz-planner-entry__hero-left .mealz-planner-entry__hero-badge,:root .mealz-planner-entry__content[data-lang^=en] .mealz-planner-entry__hero .mealz-planner-entry__hero-card .mealz-planner-entry__hero-left .mealz-planner-entry__hero-badge{position:absolute}:root .mealz-planner-entry__content[data-lang^=fr] .mealz-planner-entry__hero .mealz-planner-entry__hero-card .mealz-planner-entry__hero-left .mealz-planner-entry__hero-title,:root .mealz-planner-entry__content[data-lang^=en] .mealz-planner-entry__hero .mealz-planner-entry__hero-card .mealz-planner-entry__hero-left .mealz-planner-entry__hero-title{height:70px}:root .mealz-planner-entry__content[data-lang^=fr] .mealz-planner-entry__hero .mealz-planner-entry__hero-card .mealz-planner-entry__hero-left .mealz-planner-entry__hero-title:before,:root .mealz-planner-entry__content[data-lang^=en] .mealz-planner-entry__hero .mealz-planner-entry__hero-card .mealz-planner-entry__hero-left .mealz-planner-entry__hero-title:before{background-image:var(--coursesu-planner-entry-title-mobile-image)}}:root .mealz-planner-entry__content .mealz-planner-entry__header .mealz-planner-entry__header-left .mealz-planner-entry__stepper button{border-radius:100px}:root .mealz-planner-entry__content .mealz-planner-entry__stepper button{border-radius:100px}:root .mealz-planner-entry__content .mealz-planner-entry__hero-option button{border-radius:100px}:root .mealz-planner-entry__title{font-size:20px;line-height:120%;font-weight:700;color:#000}:root #idees-repas .mealz-planner-entry__title{font-size:20px!important;margin:0!important}:root .mealz-planner-entry__help-link{text-decoration:underline}:root #idees-repas .mealz-planner-entry-container,:root .mealz-planner-entry__options .mealz-planner-menu-option{width:100%}@media(max-width:1200px){:root .mealz-planner-entry__banner{margin:0 -20px;border-radius:0}:root .mealz-planner-entry__options .mealz-planner-menu-option{width:430px}}@media(min-width:851px)and (max-width:1048px){:root .mealz-planner-entry__hero-overlays .mealz-planner-entry__hero-overlay-2,:root .mealz-planner-entry__hero-overlays .mealz-planner-entry__hero-overlay-3{display:none}:root .mealz-planner-entry__hero-card{flex-direction:column;align-items:center;gap:20px;max-width:560px;padding:44px 24px 24px}:root .mealz-planner-entry__hero-left{position:relative;width:100%;align-items:center;gap:0;margin-right:0;margin-bottom:0}:root .mealz-planner-entry__hero-badge{position:absolute;top:-56px}:root .mealz-planner-entry__hero-title{width:242px;align-items:center}:root .mealz-planner-entry__hero-right{display:flex;flex-direction:column;align-items:center;width:100%;margin-left:0}:root .mealz-planner-entry__hero-description{margin-bottom:16px;text-align:center}:root .mealz-planner-entry__hero-avatars-wrapper{margin-bottom:16px}:root .mealz-planner-entry__hero-actions{gap:12px;flex-wrap:wrap;justify-content:center}:root .mealz-planner-entry__hero-actions .mealz-planner-entry__stepper{margin-right:0}}@media(max-width:851px){:root .mealz-planner-entry-container .mealz-to-basket-loader{height:calc(100% - 185px);width:100%;top:185px}}@media(max-width:607px){:root .mealz-planner-entry__options .mealz-planner-menu-option{width:280px}}:root mealz-planner-catalog .mealz-catalog-list{background-color:#fff}:root mealz-planner-catalog .mealz-catalog-list .mealz-recipe-card .mealz-recipe-card__container .mealz-recipe-card__bottom .mealz-recipe-card__actions .mealz-recipe-card__cta mealz-recipe-card-cta .mealz-ds-button:before{content:none;height:unset;width:unset;background-image:none;background-size:unset;background-position:unset;background-repeat:unset}:root mealz-planner-catalog .mealz-catalog-list .mealz-recipe-card .mealz-recipe-card__container .mealz-recipe-card__bottom .mealz-recipe-card__actions .mealz-recipe-card__cta mealz-recipe-card-cta .mealz-ds-button img{display:revert}:root mealz-planner-catalog .mealz-catalog-list .mealz-recipe-card .mealz-recipe-card__container .mealz-recipe-card__bottom .mealz-recipe-card__actions .mealz-recipe-card__cta mealz-recipe-card-cta .mealz-ds-button img.hidden{display:none}:root mealz-planner-catalog .mealz-catalog-toolbar:not(.sticking){background-color:#fff}:root mealz-planner-catalog .mealz-catalog__content{background-color:#fff}:root .mealz-planner-card-link .mealz-planner-card-link__logo{content:url(https://storage.googleapis.com/assets.miam.tech/coursesu/images/1.45/meals-planner_logo.png)}:root .mealz-planner-card-link .mealz-planner-card-link__container .mealz-ds-button{border-radius:16px}:root .mealz-planner-card-link .mealz-planner-card-link__container .mealz-ds-button .mealz-ds-text{line-height:16px}:root .mealz-planner-banner .mealz-planner-banner__logo{content:url(https://storage.googleapis.com/assets.miam.tech/coursesu/images/1.45/meals-planner_logo.png)}:root .mealz-planner-banner .mealz-planner-banner__container .mealz-ds-button{border-radius:16px}:root .mealz-planner-banner .mealz-planner-banner__container .mealz-ds-button .mealz-ds-text{line-height:16px}:root .mealz-planner-form .mealz-planner-form__logo{content:url(https://storage.googleapis.com/assets.miam.tech/coursesu/images/1.45/meals-planner_logo.png)}:root .mealz-planner-form .mealz-planner-form__container .mealz-planner-form__budget .mealz-planner-form__budget-container .mealz-ds-text{font-family:Open Sans Regular,sans-serif}:root .mealz-planner-form .mealz-planner-form__container .mealz-planner-form__budget .mealz-planner-form__budget-container .mealz-planner-form__budget-input-container .mealz-planner-form__budget-input{height:initial;padding:initial;font-family:Open Sans Regular,sans-serif}:root .mealz-planner-form .mealz-planner-form__container .mealz-planner-form__submit-button{border-radius:24px}@media(max-width:1035px){:root .mealz-planner-form{background-image:url(https://storage.googleapis.com/assets.miam.tech/generic/images/meals-planner_form_bg_app.png);background-position:top;justify-content:space-between}:root .mealz-planner-form .mealz-planner-form__container{width:100%;height:100%;padding:24px 16px;box-shadow:none;border-radius:32px 32px 0 0}:root .mealz-planner-form .mealz-planner-form__container .mealz-planner-form__header{margin-top:16px}:root .mealz-planner-form .mealz-planner-form__submit-button{width:100%;margin-bottom:16px}}:root .mealz-planner-dashboard .mealz-planner-dashboard__title .mealz-planner-dashboard__title-icon:not(.ghost):not(.disabled):not([disabled]){border-radius:100%;height:40px;width:40px}:root .mealz-planner-dashboard .mealz-planner-dashboard__content .mealz-planner-menu-option .mealz-planner-menu-option__container .mealz-planner-menu-option__texts .mealz-planner-menu-option__subtitle{font-family:Open Sans Regular,sans-serif}@media(max-width:874px){:root .mealz-planner-dashboard .mealz-planner-dashboard__content .mealz-planner-menu-option .mealz-planner-menu-option__container{padding:16px}:root .mealz-planner-dashboard .mealz-planner-dashboard__content .mealz-planner-menu-option .mealz-planner-menu-option__container .mealz-planner-menu-option__top .mealz-planner-menu-option__avatars .mealz-ds-avatar{width:54px;height:54px}:root .mealz-planner-dashboard .mealz-planner-dashboard__content .mealz-planner-menu-option .mealz-planner-menu-option__container .mealz-planner-menu-option__title{font-size:16px;line-height:150%;font-weight:700}:root .mealz-planner-dashboard .mealz-planner-dashboard__content .mealz-planner-menu-option .mealz-planner-menu-option__container .mealz-planner-menu-option__subtitle{font-size:14px;line-height:150%;font-weight:500}}:root .mealz-planner-dashboard .mealz-planner-dashboard__content .mealz-planner-dashboard__onboarding-and-history .mealz-planner-dashboard__onboarding-container{margin-right:0}:root .mealz-planner-dashboard .mealz-planner-dashboard__content .mealz-planner-dashboard__onboarding-and-history .mealz-planner-dashboard__history-container{display:none}@media(max-width:1290px){:root .mealz-planner-dashboard .mealz-planner-dashboard__content .mealz-planner-dashboard__options{flex-direction:column;margin-bottom:12px}:root .mealz-planner-dashboard .mealz-planner-dashboard__content .mealz-planner-dashboard__options>*:not(:last-child){margin-right:0;margin-bottom:12px}:root .mealz-planner-dashboard .mealz-planner-dashboard__content .mealz-planner-dashboard__title{margin:24px 0;padding:0 24px}:root .mealz-planner-dashboard .mealz-planner-dashboard__content .mealz-planner-dashboard__content{padding:0 24px}}@media(max-width:967px){:root .mealz-planner-dashboard .mealz-planner-dashboard__content .mealz-planner-dashboard__title{margin:16px 0}:root .mealz-planner-dashboard .mealz-planner-dashboard__content .mealz-planner-dashboard__content{padding:0 16px}}:root .mealz-planner-current-menu .mealz-planner-current-menu__content .mealz-planner-current-menu__menu .mealz-planner-current-menu__menu-content .mealz-planner-current-menu__menu-top .mealz-planner-current-menu__menu-header .mealz-planner-current-menu__menu-header-texts .mealz-planner-current-menu__menu-subtitle{font-family:Open Sans Regular,sans-serif}:root .mealz-planner-current-menu .mealz-planner-current-menu__content .mealz-planner-current-menu__menu .mealz-planner-current-menu__menu-content .mealz-planner-current-menu__menu-top .mealz-planner-current-menu__menu-header .mealz-planner-current-menu__menu-header-actions .mealz-planner-current-menu__menu-header-preferences{display:none}:root .mealz-planner-current-menu .mealz-planner-current-menu__content .mealz-planner-current-menu__menu .mealz-planner-current-menu__menu-content .mealz-planner-current-menu__menu-top .mealz-planner-current-menu__cancel-menu .mealz-planner-current-menu__cancel-menu-button .mealz-planner-current-menu__cancel-menu-text{font-family:Open Sans Regular,sans-serif}:root .mealz-planner-current-menu .mealz-planner-current-menu__content .mealz-planner-current-menu__menu .mealz-planner-current-menu__menu-content .mealz-planner-current-menu__meal-extras .mealz-planner-current-menu__meal-extras-choice img{max-width:initial}:root .mealz-planner-current-menu .mealz-planner-current-menu__content .mealz-planner-current-menu__menu .mealz-planner-current-menu__menu-content .mealz-planner-current-menu__meal-extras .mealz-planner-current-menu__meal-extras-choice .mealz-ds-text{font-family:Open Sans Regular,sans-serif}:root .mealz-planner-current-menu .mealz-planner-current-menu__content .mealz-planner-current-menu__menu .mealz-planner-current-menu__footer .mealz-planner-current-menu__footer-button{border-radius:24px}:root .mealz-planner-current-menu .mealz-planner-current-menu__content .mealz-planner-current-menu__menu .mealz-planner-current-menu__footer .mealz-planner-budget-gauge__budget-define{background-color:var(--mealz-ds-color-neutral-100, #eff1f3);border:none}:root .mealz-planner-current-menu .mealz-planner-current-menu__content .mealz-planner-current-menu__menu .mealz-planner-current-menu__footer .mealz-planner-budget-gauge__budget-define:hover{color:var(--mealz-ds-color-neutral-black, #000);background-color:var(--mealz-ds-color-neutral-200, #d9dde1)}:root .mealz-planner-current-menu .mealz-planner-current-menu__content .mealz-planner-current-menu__menu .mealz-planner-current-menu__footer .mealz-planner-current-menu__footer-budget .mealz-planner-budget-gauge .mealz-planner-budget-gauge__budget .mealz-planner-budget-gauge__budget-total{display:flex;flex-direction:column;align-items:center}:root .mealz-planner-current-menu .mealz-planner-current-menu__content .mealz-planner-current-menu__menu .mealz-planner-current-menu__footer .mealz-planner-current-menu__footer-budget .mealz-planner-budget-gauge .mealz-planner-budget-gauge__budget .mealz-planner-budget-gauge__budget-total:after{content:"";display:block;width:100%;height:4px;background-image:url(https://storage.googleapis.com/assets.miam.tech/coursesu/images/icon-trait-yellow.svg);background-repeat:no-repeat;background-size:100% 100%}:root .mealz-planner-current-menu .mealz-planner-current-menu__content .mealz-planner-current-menu__menu .mealz-planner-current-menu__footer .mealz-planner-current-menu__footer-budget .mealz-planner-budget-gauge .mealz-planner-budget-gauge__budget .mealz-planner-budget-gauge__budget-overflow img{display:none}:root .mealz-planner-current-menu .mealz-planner-current-menu__content .mealz-planner-current-menu__menu .mealz-planner-current-menu__footer .mealz-planner-current-menu__footer-budget .mealz-planner-budget-gauge .mealz-planner-budget-gauge__budget .mealz-planner-budget-gauge__budget-overflow.mealz-ds-badge.warning{background-color:var(--mealz-gauge-danger-background-color);color:var(--mealz-gauge-danger-color)}:root .mealz-planner-current-menu .mealz-planner-current-menu__content .mealz-planner-current-menu__menu .mealz-planner-current-menu__footer .mealz-planner-current-menu__footer-budget .mealz-planner-budget-gauge .mealz-planner-budget-gauge__gauge{background-color:var(--mealz-gauge-background-color, #f3f6f6)}:root .mealz-planner-current-menu .mealz-planner-current-menu__content .mealz-planner-current-menu__menu .mealz-planner-current-menu__footer .mealz-planner-current-menu__footer-budget .mealz-planner-budget-gauge .mealz-planner-budget-gauge__gauge .mealz-planner-budget-gauge__gauge-bar{background-color:var(--mealz-gauge-color, #66b1bc)}:root .mealz-planner-current-menu .mealz-planner-current-menu__content .mealz-planner-current-menu__menu .mealz-planner-current-menu__footer .mealz-planner-current-menu__footer-budget .mealz-planner-budget-gauge .mealz-planner-budget-gauge__gauge .mealz-planner-budget-gauge__gauge-bar-overflow{background-color:var(--mealz-gauge-danger-color, #ec0000)}:root .mealz-planner-current-menu .mealz-planner-current-menu__content .mealz-planner-current-menu__recipe .mealz-planner-recipe-suggestion .mealz-planner-recipe-suggestion__content .mealz-planner-recipe-suggestion__infos-and-actions .mealz-planner-recipe-suggestion__recipe-infos .mealz-planner-recipe-suggestion__see-recipe .mealz-ds-text{font-family:Open Sans Regular,sans-serif}:root .mealz-planner-current-menu .mealz-planner-current-menu__content .mealz-planner-current-menu__recipe .mealz-planner-recipe-suggestion .mealz-planner-recipe-suggestion__content .mealz-planner-recipe-suggestion__infos-and-actions .mealz-planner-recipe-suggestion__actions .mealz-planner-recipe-suggestion__actions-add-and-swap .mealz-ds-button,:root .mealz-planner-current-menu .mealz-planner-current-menu__content .mealz-planner-current-menu__recipe .mealz-planner-recipe-suggestion .mealz-planner-recipe-suggestion__content .mealz-planner-recipe-suggestion__infos-and-actions .mealz-planner-recipe-suggestion__actions .mealz-planner-recipe-suggestion__actions-remove .mealz-ds-button{border-radius:33px}@media(max-width:1290px){:root .mealz-planner-current-menu .mealz-planner-current-menu__content .mealz-planner-current-menu__recipe{width:375px}:root .mealz-planner-current-menu .mealz-planner-current-menu__content .mealz-planner-current-menu__menu{width:calc(100% - 375px)}:root .mealz-planner-current-menu .mealz-planner-current-menu__content .mealz-planner-current-menu__menu .mealz-planner-recipe-list .mealz-planner-recipe-card,:root .mealz-planner-current-menu .mealz-planner-current-menu__content .mealz-planner-current-menu__menu .mealz-planner-recipe-list .mealz-planner-recipe-list__add-to-menu,:root .mealz-planner-current-menu .mealz-planner-current-menu__content .mealz-planner-current-menu__menu .mealz-planner-recipe-list .mealz-planner-recipe-list__placeholder{height:224px}:root .mealz-planner-current-menu .mealz-planner-current-menu__content .mealz-planner-current-menu__menu .mealz-planner-recipe-list .mealz-planner-recipe-card .mealz-planner-recipe-card__content,:root .mealz-planner-current-menu .mealz-planner-current-menu__content .mealz-planner-current-menu__menu .mealz-planner-recipe-list .mealz-planner-recipe-list__add-to-menu .mealz-planner-recipe-card__content,:root .mealz-planner-current-menu .mealz-planner-current-menu__content .mealz-planner-current-menu__menu .mealz-planner-recipe-list .mealz-planner-recipe-list__placeholder .mealz-planner-recipe-card__content{padding:8px}:root .mealz-planner-current-menu .mealz-planner-current-menu__content .mealz-planner-current-menu__menu .mealz-planner-recipe-list .mealz-planner-recipe-card .mealz-planner-recipe-card__content .mealz-planner-recipe-card__remove-button,:root .mealz-planner-current-menu .mealz-planner-current-menu__content .mealz-planner-current-menu__menu .mealz-planner-recipe-list .mealz-planner-recipe-list__add-to-menu .mealz-planner-recipe-card__content .mealz-planner-recipe-card__remove-button,:root .mealz-planner-current-menu .mealz-planner-current-menu__content .mealz-planner-current-menu__menu .mealz-planner-recipe-list .mealz-planner-recipe-list__placeholder .mealz-planner-recipe-card__content .mealz-planner-recipe-card__remove-button{right:8px}:root .mealz-planner-current-menu .mealz-planner-current-menu__content .mealz-planner-current-menu__menu .mealz-planner-current-menu__footer{flex-direction:column-reverse;padding:24px 16px}:root .mealz-planner-current-menu .mealz-planner-current-menu__content .mealz-planner-current-menu__menu .mealz-planner-current-menu__footer .mealz-planner-budget-gauge{margin-right:0;margin-bottom:16px;align-items:center}}@media(max-width:1117px){:root .mealz-planner-current-menu .mealz-planner-current-menu__content .mealz-planner-current-menu__recipe{width:320px}:root .mealz-planner-current-menu .mealz-planner-current-menu__content .mealz-planner-current-menu__menu{width:calc(100% - 320px)}}@media(max-width:1035px){:root .mealz-planner-current-menu .mealz-breadcrumb{display:none}:root .mealz-planner-current-menu .mealz-planner-current-menu__content .mealz-planner-current-menu__recipe{width:100%}:root .mealz-planner-current-menu .mealz-planner-current-menu__content .mealz-planner-current-menu__recipe .mealz-planner-recipe-suggestion__infos-and-actions{padding:24px 16px}:root .mealz-planner-current-menu .mealz-planner-current-menu__content .mealz-planner-current-menu__menu{display:none;width:100%}:root .mealz-planner-current-menu .mealz-planner-current-menu__content .mealz-planner-current-menu__menu .mealz-planner-current-menu__menu-top{padding:16px}:root .mealz-planner-current-menu .mealz-planner-current-menu__content .mealz-planner-current-menu__menu .mealz-planner-current-menu__menu-top .mealz-planner-current-menu__menu-header .mealz-planner-current-menu__menu-header-actions{display:none}:root .mealz-planner-current-menu .mealz-planner-current-menu__content .mealz-planner-current-menu__menu .mealz-planner-current-menu__menu-top .mealz-planner-recipe-list{justify-content:center}:root .mealz-planner-current-menu .mealz-planner-current-menu__content .mealz-planner-current-menu__menu .mealz-planner-current-menu__footer .mealz-planner-current-menu__footer-button{width:100%}}@media(max-width:867px){:root mealz-planner-abandon-modal .mealz-modal{width:unset}}@media(max-width:867px){:root mealz-planner-current-menu-modal .mealz-modal{width:unset}:root mealz-planner-current-menu-modal .mealz-modal .mealz-modal__content-container .mealz-planner-current-menu-modal__button-container{flex-direction:column-reverse}:root mealz-planner-current-menu-modal .mealz-modal .mealz-modal__content-container .mealz-planner-current-menu-modal__button-container>*:not(:first-child){margin-bottom:12px}}@media(max-width:867px){:root mealz-planner-open-catalog-modal .mealz-modal{width:unset}:root mealz-planner-open-catalog-modal .mealz-modal__content-container .mealz-planner-open-catalog-modal__button-container{flex-direction:column-reverse}:root mealz-planner-open-catalog-modal .mealz-modal__content-container .mealz-planner-open-catalog-modal__button-container>*:not(:first-child){margin-bottom:12px}:root mealz-planner-open-catalog-modal .mealz-modal__content-container .mealz-planner-open-catalog-modal__button-container>*:not(:last-child){margin-right:0}}@media(max-width:1035px){:root .mealz-to-basket-loader .mealz-to-basket-loader__container{padding:1.5rem}:root .mealz-to-basket-loader .mealz-to-basket-loader__recipe-image{width:70px;height:70px;border:4px solid var(--mealz-ds-color-neutral-white, #fff)}}@media(max-width:500px){:root .mealz-planner-current-menu .mealz-planner-current-menu__content .mealz-planner-current-menu__menu .mealz-planner-recipe-list .mealz-planner-recipe-card,:root .mealz-planner-current-menu .mealz-planner-current-menu__content .mealz-planner-current-menu__menu .mealz-planner-recipe-list .mealz-planner-recipe-list__add-to-menu{width:100%}}:root .mealz-planner-current-menu .mealz-planner-current-menu__menu-header .mealz-planner-current-menu__menu-header-actions button.mealz-planner-current-menu__menu-header-preferences:not(.ghost):not(.hidden){display:none}@media(max-width:768px){:root .mealz-planner-current-menu .mealz-planner-current-menu__menu-header .mealz-planner-current-menu__menu-header-actions button.mealz-planner-current-menu__mobile-preferences-button{display:none}}:root .mealz-planner-current-menu .mealz-planner-current-menu__content .mealz-planner-current-menu__recipe .mealz-planner-recipe-suggestion__badge{background:#ffc700}:root .mealz-planner-current-menu .mealz-planner-current-menu__content .mealz-planner-current-menu__recipe .mealz-planner-recipe-suggestion__badge img{content:url(https://storage.googleapis.com/assets.miam.tech/coursesu/icons/lightbulb_black.svg)}:root .mealz-planner-current-menu .mealz-planner-current-menu__content .mealz-planner-current-menu__recipe .mealz-planner-recipe-suggestion__badge .mealz-ds-text{font-size:14px;line-height:16px;font-weight:700;color:#000}:root .mealz-planner-current-menu .mealz-planner-current-menu__content .mealz-planner-current-menu__recipe .mealz-planner-recipe-suggestion__content .mealz-planner-recipe-suggestion__actions .mealz-planner-recipe-suggestion__actions-add-and-swap .mealz-planner-recipe-suggestion__actions-swap-button{background:#f5f4f2}:root .mealz-planner-current-menu .mealz-planner-current-menu__content .mealz-planner-current-menu__recipe .mealz-planner-recipe-suggestion__content .mealz-planner-recipe-suggestion__actions .mealz-planner-recipe-suggestion__actions-add-and-swap .mealz-ds-button{border-radius:100px}:root .mealz-planner-current-menu .mealz-planner-current-menu__content .mealz-planner-current-menu__menu .mealz-planner-current-menu__menu-content .mealz-planner-current-menu__menu-top .mealz-planner-current-menu__menu-recipes .mealz-planner-recipe-list .mealz-planner-recipe-list__grid .mealz-planner-recipe-list__in-menu .mealz-planner-recipe-card .mealz-planner-recipe-card__content .mealz-planner-recipe-card__badges-and-actions .mealz-planner-recipe-card__remove-button{border-radius:100px}:root .mealz-planner-current-menu .mealz-planner-current-menu__content .mealz-planner-current-menu__menu .mealz-planner-current-menu__menu-content .mealz-planner-current-menu__menu-top .mealz-planner-current-menu__menu-recipes .mealz-planner-recipe-list .mealz-planner-recipe-list__header .mealz-planner-recipe-list__suggestions-button{border-radius:100px}:root .mealz-planner-current-menu .mealz-planner-current-menu__footer .mealz-planner-current-menu__footer-primary .mealz-planner-current-menu__footer-button{border-radius:100px}:root .mealz-planner-current-menu .mealz-planner-current-menu__footer .mealz-planner-current-menu__footer-primary .mealz-planner-current-menu__footer-button .mealz-planner-current-menu__footer-icon{display:none}:root .mealz-planner-current-menu .mealz-planner-current-menu__footer .mealz-planner-current-menu__footer-primary .mealz-planner-current-menu__footer-budget .mealz-planner-budget-gauge .mealz-planner-budget-gauge__budget .mealz-planner-budget-gauge__budget-define{border-radius:100px;height:32px;color:var(--mealz-ds-color-primary, #24748f)}:root .mealz-planner-current-menu .mealz-planner-current-menu__footer .mealz-planner-current-menu__footer-primary .mealz-planner-current-menu__footer-budget .mealz-planner-budget-gauge .mealz-planner-budget-gauge__budget .mealz-planner-budget-gauge__budget-define:hover{color:var(--mealz-ds-color-neutral-white, #ffffff)}:root .mealz-planner-current-menu .mealz-planner-current-menu__footer .mealz-planner-current-menu__footer-primary .mealz-planner-current-menu__footer-budget .mealz-planner-budget-gauge .mealz-planner-budget-gauge__budget .mealz-planner-budget-gauge__budget-define:hover .mealz-planner-budget-gauge__budget-edit-icon{content:url(https://storage.googleapis.com/assets.miam.tech/coursesu/icons/Edit_white.svg)}:root .mealz-planner-current-menu .mealz-planner-current-menu__footer .mealz-planner-current-menu__footer-primary .mealz-planner-current-menu__footer-budget .mealz-planner-budget-gauge .mealz-planner-budget-gauge__budget .mealz-planner-budget-gauge__budget-define .mealz-planner-budget-gauge__budget-edit-icon{content:url(https://storage.googleapis.com/assets.miam.tech/coursesu/icons/Edit_primary.svg)}:root .mealz-planner-current-menu .mealz-planner-current-menu__footer .mealz-planner-current-menu__footer-quick-menu .mealz-planner-quick-menu .mealz-planner-quick-menu__top .mealz-planner-quick-menu__see-menu{color:#fff;border-radius:100px;border:1px solid #fff}:root .mealz-planner-current-menu .mealz-planner-current-menu__footer .mealz-planner-current-menu__footer-quick-menu .mealz-planner-quick-menu .mealz-planner-quick-menu__recipes .mealz-planner-quick-menu__thumb--add{border:1px dashed #fff}:root .mealz-planner-current-menu .mealz-planner-current-menu__footer .mealz-planner-current-menu__footer-quick-menu .mealz-planner-quick-menu .mealz-planner-quick-menu__recipes .mealz-planner-quick-menu__thumb--add .mealz-planner-quick-menu__plus{color:#fff}:root .mealz-planner-current-menu .mealz-planner-current-menu__footer:has(>.mealz-planner-current-menu__footer-quick-menu:is([style*="display: block"],[style*="display:block"])){background:#005562;color:#fff}@media(min-width:1024px)and (max-height:930px){:root .mealz-planner-current-menu .mealz-planner-recipe-suggestion{height:calc(500px - (930px - 100dvh))}:root .mealz-planner-current-menu .mealz-planner-recipe-suggestion .mealz-planner-recipe-suggestion__picture{height:calc(400px - (930px - 100dvh))}:root .mealz-planner-current-menu .mealz-planner-recipe-suggestion__arrow{top:calc(500px - (930px - 100dvh))}}@media(min-width:1024px)and (max-height:830px){:root .mealz-planner-current-menu .mealz-planner-recipe-suggestion{height:calc(408px - (830px - 100dvh))}:root .mealz-planner-current-menu .mealz-planner-recipe-suggestion .mealz-planner-recipe-suggestion__picture{height:calc(300px - (830px - 100dvh))}:root .mealz-planner-current-menu .mealz-planner-recipe-suggestion__arrow{top:calc(408px - (830px - 100dvh))}:root .mealz-planner-current-menu .mealz-planner-recipe-card,:root .mealz-planner-current-menu .mealz-planner-recipe-list__placeholder,:root .mealz-planner-current-menu .mealz-planner-recipe-list__add-to-menu{height:250px}}@media(min-width:1024px)and (max-height:730px){:root .mealz-planner-current-menu .mealz-planner-recipe-suggestion{height:calc(308px - (730px - 100dvh));min-height:266px}:root .mealz-planner-current-menu .mealz-planner-recipe-suggestion .mealz-planner-recipe-suggestion__picture{height:calc(200px - (730px - 100dvh));min-height:164px}:root .mealz-planner-current-menu .mealz-planner-recipe-suggestion__arrow{top:calc(308px - (730px - 100dvh))}}@media(min-width:1024px)and (max-height:730px)and (max-height:695px){:root .mealz-planner-current-menu .mealz-planner-recipe-suggestion__arrow{top:278px}}@media(min-width:1024px)and (max-height:730px){:root .mealz-planner-current-menu .mealz-planner-recipe-card,:root .mealz-planner-current-menu .mealz-planner-recipe-list__placeholder,:root .mealz-planner-current-menu .mealz-planner-recipe-list__add-to-menu{height:224px}}@media(max-width:1023px)and (max-height:850px){:root .mealz-planner-current-menu .mealz-planner-recipe-suggestion{height:calc(364px - (850px - 100dvh))}:root .mealz-planner-current-menu .mealz-planner-recipe-suggestion .mealz-planner-recipe-suggestion__picture{height:calc(280px - (850px - 100dvh))}:root .mealz-planner-current-menu .mealz-planner-recipe-suggestion__arrow{top:calc(364px - (850px - 100dvh))}}@media(max-width:1023px)and (max-height:750px){:root .mealz-planner-current-menu .mealz-planner-recipe-suggestion{height:calc(264px - (750px - 100dvh));min-height:236px}:root .mealz-planner-current-menu .mealz-planner-recipe-suggestion .mealz-planner-recipe-suggestion__picture{height:calc(180px - (750px - 100dvh));min-height:132px}:root .mealz-planner-current-menu .mealz-planner-recipe-suggestion__arrow{top:calc(264px - (750px - 100dvh))}}@media(max-width:1023px)and (max-height:750px)and (max-height:722px){:root .mealz-planner-current-menu .mealz-planner-recipe-suggestion__arrow{top:250px}}:root .mealz-planner__modal-root .mealz-modal__content-container .mealz-ds-button{border-radius:100px}:root .mealz-planner__modal-root .mealz-modal__content-container .mealz-planner-onboarding-modal__previous,:root .mealz-planner__modal-root .mealz-modal__content-container .mealz-planner-welcome-modal__refuse-button,:root .mealz-planner__modal-root .mealz-modal__content-container .mealz-planner-open-catalog-modal__refuse-button,:root .mealz-planner__modal-root .mealz-modal__content-container .mealz-planner-current-menu-modal__order-again-button:not(.primary){background:var(--mealz-ds-color-neutral-white, #ffffff);color:var(--mealz-ds-color-primary, #24748f);border:1px solid var(--mealz-ds-color-primary, #24748f)}:root .mealz-planner__modal-root .mealz-modal__header .mealz-modal__close-icon{background:none}:root .mealz-planner__modal-root .mealz-modal__header .mealz-ds-button.small img{width:24px;height:24px}:root .mealz-planner__modal-root .mealz-planner-onboarding-modal .mealz-planner-onboarding-modal__navigation-buttons{justify-content:flex-end;padding-right:16px;padding-bottom:8px}:root .mealz-onboarding-popover .mealz-onboarding-popover__header .mealz-ds-button.square.small{background:none}:root .mealz-onboarding-popover .mealz-onboarding-popover__header .mealz-ds-button.square.small img{width:24px;height:24px}:root .mealz-onboarding-popover .mealz-onboarding-popover__footer .mealz-ds-button{border-radius:100px}:root mealz-modal .mealz-modal .mealz-modal__header{display:flex}:root mealz-modal .mealz-modal .mealz-modal__header .mealz-modal__title{color:var(--mealz-ds-color-neutral-black, #000);font-weight:700;font-size:20px;text-align:center}:root mealz-modal .mealz-modal .mealz-modal__content-container{padding-top:16px}:root mealz-modal:not(.mealz-recipe-tag__modal-root):not(.mealz-planner__modal-root) .mealz-modal__header{background-color:#fff;position:relative;box-shadow:0 3px 10px #0000001a}:root mealz-modal:not(.mealz-recipe-tag__modal-root):not(.mealz-planner__modal-root) .mealz-modal__header .mealz-modal__close-icon{position:absolute;left:16px;top:50%;transform:translateY(-50%) rotate(180deg);background:center/24px no-repeat url(https://storage.googleapis.com/assets.miam.tech/generic/icons/arrow-right.svg)}:root mealz-modal:not(.mealz-recipe-tag__modal-root):not(.mealz-planner__modal-root) .mealz-modal__header .mealz-modal__close-icon img{display:none}:root mealz-modal.mealz-recipe-tag__modal-root .mealz-modal__header{justify-content:flex-end}:root mealz-modal.mealz-recipe-tag__modal-root .mealz-modal__title{display:none}:root .mealz-like-button.mealz-ds-button.primary.reverse{padding:4px}:root .mealz-like-button.mealz-ds-button.primary.reverse .mealz-like-button__icon{margin:2px 0 0 2px}:root .mealz-like-button.mealz-ds-button.primary.reverse .mealz-like-button__icon img{content:url(https://www.coursesu.com/on/demandware.static/Sites-DigitalU-Site/-/fr_FR/images/lists/list-add.svg)}:root .mealz-like-button.mealz-ds-button.primary.reverse .mealz-like-button__icon.fill{margin:2px}:root .mealz-like-button.mealz-ds-button.primary.reverse .mealz-like-button__icon.fill img{content:url(https://www.coursesu.com/on/demandware.static/Sites-DigitalU-Site/-/fr_FR/images/lists/list-red-heart.svg)}:root .mealz-like-button.mealz-ds-button.primary.reverse:hover .mealz-like-button__icon img{filter:unset}:root .mealz-recipe-card.variant-2 .mealz-like-button.mealz-ds-button.primary.reverse{padding:0}:root .mealz-recipe-card.variant-2 .mealz-like-button.mealz-ds-button.primary.reverse.square.small:hover{background-color:#fff}:root .mealz-catalog-home-header__title-text{color:#fff}:root .mealz-catalog__content{background-color:#f5f4f2}@media(min-width:1024px){:root .mealz-catalog__content{padding:24px 20px 48px}}:root .mealz-catalog-home__category__link{font-family:Open Sans Regular,sans-serif}:root .mealz-catalog-home__category .mealz-catalog__title{color:#000;font-style:normal;font-weight:700;line-height:120%}:root .mealz-catalog-home__category .mealz-catalog__subtitle{color:#575756;font-family:Open Sans Regular,sans-serif;font-style:normal;font-weight:400;line-height:150%}:root #idees-repas .mealz-catalog__category-title-container h2{font-size:20px!important;margin:0}:root #idees-repas .mealz-catalog__category-title-container h3{font-size:14px!important;margin:0}:root .mealz-catalog-home,:root .mealz-catalog-list,:root .mealz-catalog-category,:root .mealz-my-space{background-color:#f5f4f2}:root .mealz-catalog-tabs{background-color:#f5f4f2}:root .mealz-catalog-toolbar:not(.sticking){background-color:#f5f4f2;padding:32px 20px 0}@media(max-width:607px){:root .mealz-catalog-toolbar:not(.sticking){padding:0}}:root .mealz-catalog-toolbar.sticking{padding:8px}:root .mealz-catalog-home__planner-entry{margin-bottom:0}:root .mealz-catalog-home__all-recipes-banner .mealz-all-recipes-banner__button{border-radius:1000px;background:var(--mealz-ds-color-primary, #007D8F);margin:auto;padding:16px 20px;width:fit-content;max-width:100%;align-self:center}:root .mealz-catalog-home__all-recipes-banner .mealz-all-recipes-banner__text{color:var(--mealz-ds-color-neutral-white, #FFF)}:root .mealz-catalog-home__all-recipes-banner .mealz-all-recipes-banner__icon{transform:unset}:root .mealz-catalog-home__all-recipes-banner .mealz-all-recipes-banner__icon img{content:url(https://storage.googleapis.com/assets.miam.tech/coursesu/icons/Arrow_right_white.svg)}@media(max-width:607px){:root .mealz-catalog-category{margin-bottom:0}}:root .mealz-catalog-category .mealz-catalog__title-container{padding:0 20px}:root .mealz-catalog-category .mealz-catalog__title-container .mealz-catalog__title-icon{padding:8px;width:40px!important;height:40px!important;background-color:unset!important}:root .mealz-catalog-category .mealz-catalog__title-container .mealz-catalog__title-icon img{width:16px;height:16px}:root .mealz-catalog-category .mealz-catalog__title-container .mealz-catalog__title{color:#000;font-size:20px;font-style:normal;font-weight:700;line-height:120%}:root .mealz-catalog-category .mealz-catalog__title-container .mealz-catalog__subtitle{color:#575756;font-family:Open Sans Regular,sans-serif;font-size:14px;font-style:normal;font-weight:400;line-height:150%}:root .mealz-my-space .mealz-catalog__title-container{padding:0 20px}:root .mealz-my-space .mealz-catalog__title-container .mealz-catalog__title-icon{padding:8px;width:40px!important;height:40px!important;background-color:unset!important}:root .mealz-my-space .mealz-catalog__title-container .mealz-catalog__title-icon img{width:16px;height:16px}:root .mealz-my-space .mealz-catalog__title-container .mealz-catalog__title{color:#000;font-size:20px;font-style:normal;font-weight:700;line-height:120%}:root .mealz-my-space .mealz-catalog__title-container .mealz-catalog__subtitle{color:#575756;font-family:Open Sans Regular,sans-serif;font-size:14px;font-style:normal;font-weight:400;line-height:150%}:root .mealz-catalog-favorites__list__not-logged .mealz-catalog-favorites__list__not-logged__icon{content:url(https://storage.googleapis.com/assets.miam.tech/coursesu/images/emptySearchIcon.svg);width:180px!important;height:180px!important}:root .mealz-catalog__content .mealz-catalog-favorites__list__not-logged__title,:root .mealz-catalog__title-container .mealz-catalog-favorites__list__not-logged .mealz-catalog-favorites__list__not-logged__title{margin-top:0!important;white-space:unset!important}:root .mealz-catalog__content .mealz-catalog-favorites__list__not-logged__title span,:root .mealz-catalog__title-container .mealz-catalog-favorites__list__not-logged .mealz-catalog-favorites__list__not-logged__title span{display:none}:root .mealz-catalog__content .mealz-catalog-favorites__list__not-logged__title:after,:root .mealz-catalog__title-container .mealz-catalog-favorites__list__not-logged .mealz-catalog-favorites__list__not-logged__title:after{content:"Vous n\'avez pas encore ajouté de repas";font-weight:700}:root #idees-repas .mealz-catalog-category .mealz-catalog__category-title-container h1{font-size:20px!important;margin:0}:root #idees-repas .mealz-catalog-category .mealz-catalog__category-title-container h2{font-size:14px!important;margin:0}:root #idees-repas .mealz-breadcrumb{margin:0;padding:16px 20px 24px;align-items:center;gap:4px;flex-wrap:nowrap;border-bottom:none}:root #idees-repas .mealz-breadcrumb>a:first-child img{display:none}:root #idees-repas .mealz-breadcrumb>a:first-child:after{content:"Accueil";color:#575756;font-family:Open Sans Regular,sans-serif;font-size:12px;font-weight:600;line-height:15px;letter-spacing:-.22px;text-decoration-line:underline}:root #idees-repas .mealz-breadcrumb>a{color:#575756;font-family:Open Sans Regular,sans-serif;font-size:12px;font-weight:600;line-height:15px;letter-spacing:-.22px;text-decoration-line:underline;white-space:nowrap}:root #idees-repas .mealz-breadcrumb>a p{font-size:12px!important;font-weight:600!important;line-height:15px!important;letter-spacing:-.22px;margin:0!important}:root #idees-repas .mealz-breadcrumb>a.active{color:#575756;text-decoration-line:none;cursor:default;pointer-events:none}:root #idees-repas .mealz-breadcrumb>a.active p{font-weight:800!important}:root #idees-repas .mealz-breadcrumb>img[alt=Caret]{content:url(https://storage.googleapis.com/assets.miam.tech/coursesu/icons/Chevron-Small-Right.svg);width:16px;height:16px;flex-shrink:0}:root .mealz-my-meals-button{background-color:var(--mealz-ds-color-primary, #007D8F);gap:0}:root .mealz-my-meals-button>:not(:last-child){padding-right:12px}@media(min-width:850px){:root .mealz-my-meals-button{left:calc(287px + (100vw - 287px)/2)}}@media(max-width:607px){:root .mealz-my-meals-button{width:max-content}}:root .mealz-my-meals-button .mealz-my-meals-button__second__icon{content:url(https://storage.googleapis.com/assets.miam.tech/generic/icons/ArrowLeft_white.svg);transform:rotate(180deg)}:root #idees-repas mealz-my-meals-button__text{margin:0 4px!important;font-size:16px!important}@media(max-width:607px){:root .mealz-catalog-toolbar .mealz-catalog-toolbar__buttons-container{padding:16px}}:root .mealz-catalog-toolbar .mealz-catalog-toolbar__buttons-container .mealz-catalog-toolbar__searchbar{border:1px solid #DDDDDD}:root .mealz-catalog-toolbar .mealz-catalog-toolbar__buttons-container .mealz-catalog-toolbar__searchbar input{padding:0;height:fit-content;font-weight:700;color:var(--mealz-ds-color-neutral-black, #000)}:root .mealz-catalog-toolbar .mealz-catalog-toolbar__controls__discount.mealz-ds-button.danger:not(.ghost):not(.disabled):not([disabled]){background-color:#e22019;color:var(--mealz-ds-color-neutral-white, #FFF)}:root .mealz-catalog-toolbar>* span,:root .mealz-catalog-toolbar .mealz-catalog-toolbar__controls__favorites-label{font-weight:500}:root .mealz-catalog-toolbar .mealz-catalog-toolbar__controls__favorites{min-width:fit-content}:root .mealz-catalog-toolbar .mealz-catalog-toolbar__controls__favorites img{content:url(https://storage.googleapis.com/assets.miam.tech/coursesu/icons/Heart.svg)}:root .mealz-catalog-toolbar .mealz-catalog-toolbar__controls__preferences{display:none!important}:root #idees-repas .mealz-catalog-toolbar .mealz-catalog-toolbar__controls__favorites-label{font-size:14px!important;line-height:150%}:root .mealz-drawer-view-swapper mealz-drawer .mealz-drawer:has(mealz-preferences.visible){width:480px}:root .mealz-preferences .mealz-preferences__header{background-color:#005562}:root .mealz-preferences .mealz-preferences__header .mealz-preferences__title{color:#fff;font-weight:700;font-size:20px;text-align:center}:root .mealz-preferences .mealz-preferences__header .mealz-preferences__close-button:before{display:block;content:"";height:32px;width:32px;background-image:url(https://storage.googleapis.com/assets.miam.tech/coursesu/icons/1.39/Circled_White_Cross.svg);background-size:contain}:root .mealz-preferences .mealz-preferences__header .mealz-preferences__close-button img{display:none}:root .mealz-preferences .mealz-preferences__guests .mealz-preferences__guest-label{font-family:Open Sans Regular,sans-serif}:root .mealz-preferences .mealz-preferences__guest-counter .mealz-counter__value-container{width:initial}:root .mealz-preferences .mealz-counter .mealz-counter__counter .mealz-counter__minus{background-color:transparent;color:var(--mealz-ds-color-primary, #24748f)}:root .mealz-preferences .mealz-counter .mealz-counter__counter .mealz-ds-button.small img{min-height:19px;min-width:19px}:root .mealz-preferences mealz-accordion .mealz-accordion__header{background-color:#f5f4f2}:root .mealz-preferences mealz-accordion .mealz-accordion__header span{font-family:Open Sans Regular,sans-serif}:root .mealz-preferences mealz-accordion .mealz-accordion__header .mealz-accordion__icon{content:url(https://storage.googleapis.com/assets.miam.tech/coursesu/icons/Chevron_down.svg)}:root .mealz-preferences .mealz-preferences__list .mealz-preferences__list__item .mealz-preferences__list__item__name{font-family:Open Sans Regular,sans-serif}:root .mealz-preferences .mealz-preferences__badge{background-color:#f5f4f2}:root .mealz-preferences .mealz-preferences__badge .mealz-preferences__badge-label{font-family:Open Sans Regular,sans-serif}:root .mealz-preferences .mealz-preferences__footer .mealz-ds-button.secondary{border:none}@media(max-width:850px){:root .mealz-drawer-view-swapper mealz-drawer .mealz-drawer:has(mealz-preferences.visible){width:100%}:root .mealz-preferences .mealz-preferences__footer{width:100%}}:root{--mealz-history-order-width: 288px}:root mealz-catalog-history .mealz-catalog-history{padding:24px}:root mealz-catalog-history .mealz-catalog-history .mealz-catalog__list{grid-template-columns:repeat(auto-fill,minmax(var(--mealz-history-order-width, 288px),1fr))}:root mealz-catalog-history .mealz-catalog-history .mealz-catalog-history__empty img{content:url(https://storage.googleapis.com/assets.miam.tech/coursesu/images/emptySearchIcon.svg)}:root .mealz-history-order{width:100%;height:132px;border-radius:8px;border:1px solid #DDD;background:#fff}:root .mealz-history-order .mealz-history-order__container .mealz-history-order__bottom .mealz-history-order__bottom-date{background:#f5f4f2}:root .mealz-history-order .mealz-history-order__container .mealz-history-order__bottom .mealz-history-order__bottom-date span:first-of-type{display:none}:root .mealz-history-order .mealz-history-order__container .mealz-history-order__bottom .mealz-history-order__bottom-date span{font-family:Mulish;font-size:14px;font-style:normal;font-weight:600;line-height:16px;color:#000}:root .mealz-history-order .mealz-history-order__container .mealz-history-order__bottom .mealz-history-order__bottom-date:before{content:"Commande du";font-family:Mulish;font-size:14px;font-style:normal;font-weight:600;line-height:16px;color:#000;margin-right:4px}:root .mealz-history-order .mealz-history-order__container .mealz-history-order__bottom .mealz-ds-button{border-radius:100px;background:#f5f4f2}:root .mealz-history-order .mealz-history-order__container .mealz-history-order__bottom .mealz-ds-button .mealz-ds-text{font-family:Open Sans Regular,sans-serif;font-size:14px;font-style:normal;font-weight:600;line-height:16px;color:#000}:root .mealz-recipe-details .mealz-recipe-details__container .mealz-recipe-details__sticky-header .mealz-recipe-details__title-container .mealz-recipe-details__title{font-weight:600}:root .mealz-recipe-details .mealz-recipe-details__container .mealz-recipe-details__sticky-header .mealz-recipe-details__title-container .mealz-recipe-details__actions__icon .mealz-recipe-details__like-button .mealz-like-button{border-radius:50%}:root .mealz-recipe-details .mealz-recipe-details__container .mealz-recipe-details__sticky-header .mealz-recipe-details__title-container .mealz-recipe-details__actions__icon .mealz-recipe-details__like-button .mealz-like-button .mealz-like-button__icon{width:24px;height:24px}:root .mealz-recipe-details .mealz-recipe-details__container .mealz-recipe-details__sticky-header .mealz-recipe-details__title-container .mealz-recipe-details__actions__icon .mealz-recipe-details__like-button .mealz-like-button .mealz-like-button__icon img{width:24px!important;height:24px!important}:root .mealz-recipe-details .mealz-recipe-details__container .mealz-recipe-details__sticky-header .mealz-recipe-details__title-container .mealz-recipe-details__actions__icon .mealz-recipe-details__like-button .mealz-like-button:hover .mealz-like-button__icon .active{filter:unset}:root .mealz-recipe-details .mealz-recipe-details__container .mealz-recipe-details__sticky-header .mealz-recipe-details__title-container .mealz-recipe-details__actions__icon .mealz-recipe-details__hideable-actions .mealz-recipe-details__close-button img{max-width:inherit}:root .mealz-recipe-details .mealz-recipe-details__container .mealz-recipe-details__picture .mealz-recipe-details__banner-buttons .mealz-recipe-details__top-button-wrapper .mealz-recipe-details__close-button{padding:8px;border-radius:50%}:root .mealz-recipe-details .mealz-recipe-details__container .mealz-recipe-details__picture .mealz-recipe-details__banner-buttons .mealz-recipe-details__guest-counter .mealz-counter__value-container{width:initial}:root .mealz-recipe-details .mealz-recipe-details__container .mealz-recipe-details__picture .mealz-recipe-details__picture__filigrane{display:none}:root .mealz-recipe-details .mealz-recipe-details__container .mealz-recipe-details__footer .mealz-recipe-details__price .mealz-recipe-details__price-label{color:var(--mealz-ds-color-neutral-black, #000)}:root .mealz-recipe-details .mealz-recipe-details__container .mealz-recipe-details__footer .mealz-recipe-details__price .mealz-recipe-details__price-in-basket-label{color:#575756;opacity:1;font-weight:400;font-family:Open Sans Regular,sans-serif}:root .mealz-recipe-details .mealz-recipe-details__container .mealz-recipe-details__footer .mealz-ds-button{border-radius:100px}:root .mealz-recipe-details .mealz-recipe-details__container .mealz-recipe-details__footer .mealz-recipe-details__add-to-basket-cta img[alt="basket icon"]{content:url(https://storage.googleapis.com/assets.miam.tech/coursesu/icons/Cart.svg);height:24px;width:24px}:root .mealz-recipe-details .mealz-recipe-details__tabs .mealz-slider-tabs .mealz-slider-tab__text{font-family:Open Sans Regular,sans-serif;font-size:14px;font-weight:600;opacity:1}:root .mealz-recipe-details .mealz-counter .mealz-counter__counter .mealz-counter__minus{background-color:transparent;color:var(--mealz-ds-color-primary, #24748f)}:root .mealz-recipe-details .mealz-counter .mealz-counter__counter .mealz-ds-button.small img{min-height:19px;min-width:19px}:root .mealz-recipe-details__infos .mealz-recipe-details-infos__container .mealz-recipe-details-infos__badge{background:#fff;border:1px solid var(--mealz-ds-color-background-secondary, #E4EAEC);font-family:Open Sans Regular,sans-serif}:root .mealz-details-ingredients .mealz-details-ingredients__header.mealz-ds-text{font-weight:700}:root .mealz-details-ingredients .mealz-details-ingredients__list .mealz-details-ingredients__item{gap:4px}:root .mealz-details-ingredients .mealz-details-ingredients__list .mealz-details-ingredients__item .mealz-details-ingredients__row__qty{font-family:Open Sans Regular,sans-serif}:root .mealz-details-steps .mealz-details-steps__header.mealz-ds-text{font-weight:700}:root .mealz-details-steps .mealz-details-steps__list .mealz-details-steps__step .mealz-details-steps__step__idx{background:var(--mealz-ds-color-primary, #007d8f);color:#fff}:root .mealz-details-steps .mealz-details-steps__list .mealz-details-steps__step .mealz-details-steps__step__text{font-family:Open Sans,sans-serif}:root .mealz-products-picker .mealz-products-picker__header .mealz-products-picker__header-text{font-weight:700}:root .mealz-products-picker .mealz-accordion__header,:root .mealz-products-picker .mealz-accordion__header-no-styling{color:var(--mealz-ds-color-neutral-black, #000);font-family:Open Sans Regular,sans-serif}:root .mealz-products-picker .mealz-products-picker__secondary-list{flex-direction:column-reverse}:root .mealz-products-picker mealz-accordion.opened .mealz-accordion__icon{transform:rotate(180deg)}:root .mealz-products-picker mealz-accordion.opened .mealz-accordion__collapsable-container,:root .mealz-products-picker mealz-accordion.opened .mealz-accordion__collapsable-container-no-styling{overflow:hidden;border-bottom:1px solid var(--mealz-ds-color-neutral-200, #D9DDE1)}:root .mealz-products-picker mealz-accordion.opened .mealz-accordion__collapsable-container .mealz-accordion__collapsable-content,:root .mealz-products-picker mealz-accordion.opened .mealz-accordion__collapsable-container-no-styling .mealz-accordion__collapsable-content{opacity:0;max-height:0}:root .mealz-products-picker mealz-accordion:not(.opened) .mealz-accordion__icon{transform:rotate(0)}:root .mealz-products-picker mealz-accordion:not(.opened) .mealz-accordion__collapsable-container,:root .mealz-products-picker mealz-accordion:not(.opened) .mealz-accordion__collapsable-container-no-styling{border-bottom:0}:root .mealz-products-picker mealz-accordion:not(.opened) .mealz-accordion__collapsable-container .mealz-accordion__collapsable-content,:root .mealz-products-picker mealz-accordion:not(.opened) .mealz-accordion__collapsable-container-no-styling .mealz-accordion__collapsable-content{min-height:unset;opacity:1}@media(max-width:640px){:root .mealz-products-picker .mealz-products-picker__list{margin-bottom:16px}}:root .mealz-products-picker .mealz-product-card .mealz-ds-text{font-family:Open Sans Regular,sans-serif}:root .mealz-products-picker .mealz-product-card:not(.disabled):not(.added){border:1px solid var(--mealz-ds-color-neutral-200, #D9DDE1)}:root .mealz-products-picker .mealz-product-card .mealz-product-card__header.disabled{background:var(--mealz-ds-color-primary-100, #EDEDED)}:root .mealz-products-picker .mealz-product-card .mealz-product-card__header .mealz-product-card__header-name{font-weight:700;font-size:16px}:root .mealz-products-picker .mealz-product-card .mealz-product-card__header .mealz-product-card__header-quantity{font-size:14px;font-weight:400}:root .mealz-products-picker .mealz-product-card .mealz-product-card__content.disabled{background:var(--mealz-ds-color-primary-100, #EDEDED)}:root .mealz-products-picker .mealz-product-card .mealz-product-card__content.disabled .mealz-product-card__disabled-text{font-size:14px}:root .mealz-products-picker .mealz-product-card .mealz-product-card__content.disabled button.mealz-ds-button{height:32px;padding:4px 12px;background:var(--mealz-ds-color-neutral-white, #FFF);border-radius:100px}:root .mealz-products-picker .mealz-product-card .mealz-product-card__content.disabled button.mealz-ds-button.ghost:hover:not(.loading):not(.disabled):not([disabled]){color:var(--mealz-ds-color-primary, #007d8f)}:root .mealz-products-picker .mealz-product-card .mealz-product-card__selected-product .mealz-product-card__picture-column{flex-shrink:0}:root .mealz-products-picker .mealz-product-card .mealz-product-card__selected-product .mealz-product-card__info-column .mealz-product-card__details.product-brand,:root .mealz-products-picker .mealz-product-card .mealz-product-card__selected-product .mealz-product-card__info-column .mealz-product-card__details.product-fullname{font-family:Mulish,sans-serif}:root .mealz-products-picker .mealz-product-card .mealz-product-card__selected-product .mealz-product-card__info-column .mealz-product-card__details.product-fullname{font-family:Open Sans Regular,sans-serif}:root .mealz-products-picker .mealz-product-card .mealz-product-card__selected-product .mealz-product-card__info-column .mealz-product-badges .mealz-ds-badge{font-weight:600;color:var(--mealz-ds-color-neutral-black, #000);font-family:Open Sans Regular,sans-serif}:root .mealz-products-picker .mealz-product-card .mealz-product-card__selected-product .mealz-product-card__info-column .mealz-product-badges .mealz-product-badges__details.product-price-per-unit{color:#575756;font-weight:500;font-family:Open Sans Regular,sans-serif}:root .mealz-products-picker .mealz-product-card .mealz-product-card__selected-product .mealz-product-card__info-column .mealz-product-card__link{font-weight:600;font-size:14px}:root .mealz-products-picker .mealz-product-card mealz-promotion-badge .mealz-promotion-badge{height:auto}:root .mealz-products-picker .mealz-product-card mealz-promotion-badge .mealz-promotion-badge .mealz-promotion-badge__promotion{border:solid 1px #e02d2d;border-radius:4px;background-color:var(--mealz-ds-color-neutral-white, #FFF)}:root .mealz-products-picker .mealz-product-card .mealz-product-card__lower-action .mealz-product-card__price{font-family:Mulish,sans-serif;color:var(--mealz-ds-color-neutral-black, #000)}:root .mealz-products-picker .mealz-product-card .mealz-product-card__lower-action .mealz-product-card__cta .mealz-ds-button .mealz-product-card__disabled-text{color:#2b2b2b;opacity:1;font-size:14px}:root .mealz-products-picker .mealz-product-card .mealz-product-card__lower-action .mealz-product-card__cta .mealz-ds-button.square{border-radius:50%}:root .mealz-products-picker .mealz-product-card .mealz-product-card__lower-action .mealz-product-card__cta .mealz-product-card__add-product:before{content:"";height:24px;width:24px;background-image:url(https://storage.googleapis.com/assets.miam.tech/coursesu/icons/Cart.svg);background-size:contain;background-repeat:no-repeat;background-position:center}:root .mealz-products-picker .mealz-product-card .mealz-product-card__lower-action .mealz-product-card__cta .mealz-product-card__add-product img{display:none}:root .mealz-products-picker .mealz-product-card .mealz-product-card__lower-action .mealz-product-card__cta mealz-counter .mealz-counter.bi-color{background:var(--mealz-ds-color-primary, #007d8f);padding:0;border-radius:1000px}:root .mealz-products-picker .mealz-product-card .mealz-product-card__lower-action .mealz-product-card__cta mealz-counter .mealz-counter.bi-color.disabled{background:var(--mealz-ds-color-background-secondary, #E4EAEC)}:root .mealz-products-picker .mealz-product-card .mealz-product-card__lower-action .mealz-product-card__cta mealz-counter .mealz-counter.bi-color .mealz-counter__counter{gap:0}:root .mealz-products-picker .mealz-product-card .mealz-product-card__lower-action .mealz-product-card__cta mealz-counter .mealz-counter.bi-color .mealz-counter__counter .mealz-counter__minus,:root .mealz-products-picker .mealz-product-card .mealz-product-card__lower-action .mealz-product-card__cta mealz-counter .mealz-counter.bi-color .mealz-counter__counter .mealz-counter__plus{background-color:transparent}:root .mealz-products-picker .mealz-product-card .mealz-product-card__lower-action .mealz-product-card__cta mealz-counter .mealz-counter.bi-color .mealz-counter__counter .mealz-counter__minus:before{content:"";height:24px;width:24px;background-image:url(https://storage.googleapis.com/assets.miam.tech/generic/icons/minus-white.svg);background-size:contain;background-repeat:no-repeat;background-position:center}:root .mealz-products-picker .mealz-product-card .mealz-product-card__lower-action .mealz-product-card__cta mealz-counter .mealz-counter.bi-color .mealz-counter__counter .mealz-counter__minus img{display:none}:root .mealz-products-picker .mealz-product-card .mealz-product-card__lower-action .mealz-product-card__cta mealz-counter .mealz-counter.bi-color .mealz-counter__counter .mealz-counter__value-container{width:initial}:root .mealz-products-picker .mealz-product-card .mealz-product-card__lower-action .mealz-product-card__cta mealz-counter .mealz-counter.bi-color .mealz-counter__counter .mealz-counter__value-container .mealz-counter__value-text{color:#fff;width:inherit;font-size:12px}:root .mealz-products-picker .mealz-product-card .mealz-product-card__lower-action .mealz-product-card__cta mealz-counter .mealz-counter.bi-color .mealz-counter__counter .mealz-counter__plus:before{content:"";height:24px;width:24px;background-image:url(https://storage.googleapis.com/assets.miam.tech/generic/icons/plus-white.svg);background-size:contain;background-repeat:no-repeat;background-position:center}:root .mealz-products-picker .mealz-product-card .mealz-product-card__lower-action .mealz-product-card__cta mealz-counter .mealz-counter.bi-color .mealz-counter__counter .mealz-counter__plus img{display:none}:root .mealz-products-picker .mealz-product-card .mealz-product-card__footer__actions{gap:8px}:root .mealz-products-picker .mealz-product-card .mealz-product-card__footer__actions>*:not(:last-child){margin-right:0}:root .mealz-products-picker .mealz-product-card .mealz-product-card__footer__actions button.mealz-ds-button{padding:8px 16px}:root .mealz-products-picker .mealz-product-card-planner .mealz-ds-text{font-family:Open Sans Regular,sans-serif}:root .mealz-products-picker .mealz-product-card-planner:not(.disabled):not(.added){border:1px solid var(--mealz-ds-color-neutral-200, #D9DDE1)}:root .mealz-products-picker .mealz-product-card-planner .mealz-product-card-planner__header.disabled{background:var(--mealz-ds-color-primary-100, #EDEDED)}:root .mealz-products-picker .mealz-product-card-planner .mealz-product-card-planner__header .mealz-product-card-planner__header-name{font-weight:700;font-size:16px}:root .mealz-products-picker .mealz-product-card-planner .mealz-product-card-planner__header .mealz-product-card-planner__header-quantity{font-size:14px;font-weight:400}:root .mealz-products-picker .mealz-product-card-planner .mealz-product-card-planner__content.disabled{background:var(--mealz-ds-color-primary-100, #EDEDED)}:root .mealz-products-picker .mealz-product-card-planner .mealz-product-card-planner__content.disabled .mealz-product-card-planner__disabled-text{font-size:14px}:root .mealz-products-picker .mealz-product-card-planner .mealz-product-card-planner__content.disabled button.mealz-ds-button{height:32px;padding:4px 12px;background:var(--mealz-ds-color-neutral-white, #FFF);border-radius:100px}:root .mealz-products-picker .mealz-product-card-planner .mealz-product-card-planner__content.disabled button.mealz-ds-button.ghost:hover:not(.loading):not(.disabled):not([disabled]){color:var(--mealz-ds-color-primary, #007d8f)}:root .mealz-products-picker .mealz-product-card-planner .mealz-product-card-planner__selected-product .mealz-product-card-planner__picture-column{flex-shrink:0}:root .mealz-products-picker .mealz-product-card-planner .mealz-product-card-planner__selected-product .mealz-product-card-planner__info-column .mealz-product-card-planner__details.product-brand,:root .mealz-products-picker .mealz-product-card-planner .mealz-product-card-planner__selected-product .mealz-product-card-planner__info-column .mealz-product-card-planner__details.product-fullname{font-family:Mulish,sans-serif}:root .mealz-products-picker .mealz-product-card-planner .mealz-product-card-planner__selected-product .mealz-product-card-planner__info-column .mealz-product-card-planner__details.product-fullname{font-family:Open Sans Regular,sans-serif}:root .mealz-products-picker .mealz-product-card-planner .mealz-product-card-planner__selected-product .mealz-product-card-planner__info-column .mealz-product-badges .mealz-ds-badge{font-weight:600;color:var(--mealz-ds-color-neutral-black, #000);font-family:Open Sans Regular,sans-serif}:root .mealz-products-picker .mealz-product-card-planner .mealz-product-card-planner__selected-product .mealz-product-card-planner__info-column .mealz-product-badges .mealz-product-badges__details.product-price-per-unit{color:#575756;font-weight:500;font-family:Open Sans Regular,sans-serif}:root .mealz-products-picker .mealz-product-card-planner .mealz-product-card-planner__selected-product .mealz-product-card-planner__info-column .mealz-product-card-planner__link{font-weight:600;font-size:14px}:root .mealz-products-picker .mealz-product-card-planner .mealz-product-card-planner__lower-action .mealz-product-card-planner__price{font-family:Mulish,sans-serif;color:var(--mealz-ds-color-neutral-black, #000)}:root .mealz-products-picker .mealz-product-card-planner .mealz-product-card-planner__footer__actions{gap:8px}:root .mealz-products-picker .mealz-product-card-planner .mealz-product-card-planner__footer__actions>*:not(:last-child){margin-right:0}:root .mealz-products-picker .mealz-product-card-planner .mealz-product-card-planner__footer__actions button.mealz-ds-button{padding:8px 16px}:root mealz-counter .mealz-counter{border-radius:1000px;padding:8px}:root mealz-counter .mealz-counter .mealz-counter__counter .mealz-counter__minus,:root mealz-counter .mealz-counter .mealz-counter__counter .mealz-counter__plus{margin:0;height:18px;width:18px;border:none;background-color:transparent!important}:root mealz-counter .mealz-counter .mealz-counter__counter .mealz-counter__minus:hover,:root mealz-counter .mealz-counter .mealz-counter__counter .mealz-counter__plus:hover{background-color:transparent!important}:root mealz-counter .mealz-counter .mealz-counter__counter .mealz-counter__minus img,:root mealz-counter .mealz-counter .mealz-counter__counter .mealz-counter__plus img{width:11px!important;height:11px!important}:root mealz-counter .mealz-counter .mealz-counter__counter .mealz-counter__value-container{width:initial}:root mealz-counter .mealz-counter .mealz-counter__counter .mealz-counter__value-text{font-family:Open Sans Regular,sans-serif;font-weight:700;font-size:13px;line-height:16px}:root .mealz-replace-item .mealz-replace-item__header .mealz-ds-button{border-radius:50%}:root .mealz-replace-item .mealz-replace-item__product-list .mealz-replace-item__product-price{font-family:Mulish,sans-serif;color:var(--mealz-ds-color-neutral-black, #000)}:root .mealz-replace-item .mealz-replace-item__product-list mealz-promotion-badge .mealz-promotion-badge{height:auto}:root .mealz-replace-item .mealz-replace-item__product-list mealz-promotion-badge .mealz-promotion-badge .mealz-promotion-badge__promotion{border:solid 1px #e02d2d;border-radius:4px;background-color:var(--mealz-ds-color-neutral-white, #FFF)}:root .mealz-replace-item .mealz-replace-item__product-list .mealz-ds-button{border-radius:100px}:root .mealz-replace-item .mealz-replace-item__product-list .mealz-replace-item-card__cta{font-family:Open Sans Regular,sans-serif;font-size:14px;font-weight:600}:root .mealz-replace-item .mealz-replace-item__error .mealz-replace-item__error-image-container img{content:url(https://storage.googleapis.com/assets.miam.tech/coursesu/images/no-product-found.png)}:root .mealz-replace-item .mealz-replace-item__searchbar:before{content:"";height:20px;width:20px;background-image:url(https://storage.googleapis.com/assets.miam.tech/coursesu/icons/Search.svg);background-size:contain;background-repeat:no-repeat;filter:brightness(0)}:root .mealz-replace-item .mealz-replace-item__searchbar img[alt="search icon"]{display:none}:root .mealz-replace-item-planner .mealz-replace-item-planner__header .mealz-ds-button{border-radius:50%}:root .mealz-replace-item-planner .mealz-replace-item-planner__product-list .mealz-replace-item__product-price{font-family:Mulish,sans-serif;color:var(--mealz-ds-color-neutral-black, #000)}:root .mealz-replace-item-planner .mealz-replace-item-planner__product-list .mealz-ds-button{border-radius:100px}:root .mealz-replace-item-planner .mealz-replace-item-planner__error .mealz-replace-item-planner__error-image-container img{content:url(https://storage.googleapis.com/assets.miam.tech/coursesu/images/no-product-found.png)}:root .mealz-replace-item-planner .mealz-replace-item-planner__searchbar:before{content:"";height:20px;width:20px;background-image:url(https://storage.googleapis.com/assets.miam.tech/coursesu/icons/Search.svg);background-size:contain;background-repeat:no-repeat;filter:brightness(0)}:root .mealz-replace-item-planner .mealz-replace-item-planner__searchbar img[alt="search icon"]{display:none}:root .mealz-basket-preview .mealz-basket-preview__title{text-align:center;color:var(--mealz-ds-color-neutral-black, #000);font-family:Mulish,sans-serif}:root .mealz-basket-preview .mealz-basket-preview__title .mealz-ds-text.size-l{font-size:16px}:root .mealz-basket-preview .mealz-basket-preview__title .mealz-ds-text.weight-xxl{font-weight:700}:root .mealz-basket-preview .mealz-basket-preview__recipes .mealz-basket-preview__recipe-card .mealz-basket-preview__recipe-title-container .mealz-basket-preview__recipe-title{color:var(--mealz-ds-color-neutral-black, #000)}:root .mealz-basket-preview .mealz-basket-preview__recipes .mealz-basket-preview__recipe-card .mealz-basket-preview__recipe-title-container .mealz-basket-preview__remove-button img{content:url(https://storage.googleapis.com/assets.miam.tech/coursesu/icons/Trash.svg);height:24px;width:24px}:root .mealz-basket-preview .mealz-basket-preview__recipes .mealz-basket-preview__recipe-card .mealz-basket-preview__total-price{color:var(--mealz-ds-color-neutral-black, #000);font-weight:600}:root .mealz-basket-preview .mealz-basket-preview__recipes .mealz-basket-preview__recipe-card .mealz-basket-preview__number-product,:root .mealz-basket-preview .mealz-basket-preview__recipes .mealz-basket-preview__recipe-card .mealz-basket-preview__price-per-serve{color:#575756;font-family:Open Sans Regular,sans-serif}:root .mealz-basket-preview .mealz-basket-preview__recipes .mealz-basket-preview__recipe-card .mealz-basket-preview__open-recipe-button-container .mealz-basket-preview__open-recipe-button{display:inline-flex;align-items:center;background-color:transparent;color:var(--mealz-ds-color-primary, #007D8F);padding:8px 12px;border:1px var(--mealz-ds-color-primary, #007D8F) solid;border-radius:30px;font-weight:600;font-family:Open Sans Regular,sans-serif}:root .mealz-basket-preview .mealz-basket-preview__recipes .mealz-basket-preview__recipe-card .mealz-basket-preview__open-recipe-button-container .mealz-basket-preview__open-recipe-button:after{content:"";margin-left:4px;display:inline-block;flex-shrink:0;height:24px;width:24px;background:center/contain no-repeat url(https://storage.googleapis.com/assets.miam.tech/generic/icons/arrow-right.svg)}:root .mealz-basket-preview .mealz-basket-preview__footer{box-shadow:none}:root .mealz-basket-preview .mealz-basket-preview__footer .mealz-basket-preview__see-basket-button{font-family:Open Sans Regular,sans-serif;border-radius:30px;font-size:14px;line-height:20px;font-weight:600}:root .mealz-drawer-view-swapper mealz-drawer .mealz-drawer:has(mealz-basket-preview.visible) .mealz-drawer__header .mealz-drawer__header-container{display:block;position:relative;padding:20px;background-color:#005562;border-bottom:none}:root .mealz-drawer-view-swapper mealz-drawer .mealz-drawer:has(mealz-basket-preview.visible) .mealz-drawer__header .mealz-drawer__header-container .mealz-drawer__title{color:#fff;font-weight:700;text-align:center}:root .mealz-drawer-view-swapper mealz-drawer .mealz-drawer:has(mealz-basket-preview.visible) .mealz-drawer__header .mealz-drawer__header-container .mealz-drawer__close-icon{position:absolute;left:unset;right:12px;top:50%;transform:translateY(-50%);padding:16px;background:center/24px no-repeat url(https://storage.googleapis.com/assets.miam.tech/coursesu/icons/1.39/Circled_White_Cross.svg)}:root .mealz-drawer-view-swapper mealz-drawer .mealz-drawer:has(mealz-basket-preview.visible) .mealz-drawer__header .mealz-drawer__header-container .mealz-drawer__close-icon img{display:none}:root #mealzMesRepas{position:relative}:root #mealzMesRepas .mealz-recipe-counter{display:flex;position:absolute;top:15px;left:90px;background-color:#e22019;border-radius:50%;color:var(--mealz-ds-color-neutral-white, #fff);padding:2px 4px;font-size:10px;width:19px;height:19px;justify-content:center;align-items:center;border:solid 2px var(--mealz-ds-color-neutral-white, #fff);font-family:Nunito}:root #mealzMesRepas:hover .link-header:not(.hovered){display:none}:root #mealzMesRepas:hover .hovered{display:flex}:root .mealz-hidden{display:none!important}:root .mealz-recap-page-header{display:flex;margin-left:240px;background:var(--mealz-ds-color-primary, #007d8f);padding:32px;height:236px;color:#fff;font-style:normal;font-weight:700;font-size:14px;line-height:16px;flex-direction:column;justify-content:space-evenly}@media(max-width:1022px){:root .mealz-recap-page-header{margin-left:0;padding:16px;height:200px}}:root .mealz-recap-page-header .mealz-recap-page-header__breadcrumbs{display:flex;align-items:center;gap:8px}:root .mealz-recap-page-header .mealz-recap-page-header__breadcrumbs .mealz-recap-page-header__breadcrumbs__home{width:16px;height:16px;background-image:url(https://storage.googleapis.com/assets.miam.tech/coursesu/icons/Home.svg);background-size:cover;background-position:center;background-repeat:no-repeat}:root .mealz-recap-page-header .mealz-recap-page-header__breadcrumbs .mealz-recap-page-header__breadcrumbs__caret{width:16px;height:16px;background-image:url(https://storage.googleapis.com/assets.miam.tech/coursesu/icons/Caret%20_white.svg);background-size:cover;background-position:center;background-repeat:no-repeat}:root .mealz-recap-page-header .mealz-recap-page-header__title{font-size:35px;line-height:40px}:root .mealz-recap-page-header .mealz-recap-page-header__title .mealz-recipe-counter{display:unset!important;position:unset!important;background-color:unset!important;color:#fff;padding:0!important;font-size:unset!important;width:unset!important;height:unset!important;border:none!important;font-family:Nunito}:root .mealz-recap-page-header .mealz-recap-page-header__title .mealz-recipe-counter.mealz-hidden{display:unset!important}:root .mealz-recap-page-header .mealz-recap-page-header__title .mealz-recap-page-header__subtitle{font-weight:400}@media(max-width:1022px){:root .mealz-recap-page-header{margin-left:unset}}:root .mealz-recap-page__main__container{background-color:var(--mealz-ds-color-neutral-white, #fff);margin-left:240px;padding-top:100px}@media(max-width:1022px){:root .mealz-recap-page__main__container{position:relative;margin-left:0;padding-top:40px}}:root .mealz-recap-page__main__container .mealz-recipes-page__header{display:none}:root .mealz-recap-page__main__container .mealz-recap-page__sub__container{padding:0 1em;max-width:1360px;margin:0 auto;display:flex;align-items:flex-start}:root .mealz-recap-page__main__container .mealz-recap-page__sub__container .mealz-recap-page__sub__container__left{margin-right:3.2rem;margin-left:3.2rem;width:100%;min-width:0;position:relative}@media(max-width:1022px){:root .mealz-recap-page__main__container .mealz-recap-page__sub__container .mealz-recap-page__sub__container__left{margin-right:0;margin-left:0}}:root .mealz-recap-page__main__container .mealz-recap-page__sub__container .mealz-recap-page__sub__container__left .mealz-recap-page__left__header{display:none}:root .mealz-recap-page__main__container .mealz-recap-page__sub__container .mealz-recap-page__sub__container__left .mealz-recap-page__left__recipe__block{padding:20px 28px;background-color:var(--mealz-ds-color-neutral-white, #fff);display:flex;flex-direction:column}:root .mealz-recap-page__main__container .mealz-recap-page__sub__container .mealz-recap-page__sub__container__left .mealz-recap-page__left__recipe__block .mealz-recap-page__recipe__block__header{display:none}:root .mealz-recap-page__main__container .mealz-recap-page__sub__container .mealz-recap-page__sub__container__left .mealz-recap-page__left__button__raw{margin-bottom:3.2rem;margin-top:3.2rem;position:absolute;top:-100px}@media(max-width:1022px){:root .mealz-recap-page__main__container .mealz-recap-page__sub__container .mealz-recap-page__sub__container__left .mealz-recap-page__left__button__raw{left:unset;top:20px;margin-bottom:0;margin-top:0}}:root .mealz-recap-page__main__container .mealz-recap-page__sub__container .mealz-recap-page__sub__container__left .mealz-recap-page__left__button__raw .mealz-recap-page__raw__continue__button{color:var(--mealz-ds-color-primary, #007d8f);padding:0 1.6rem;position:relative;align-items:center;justify-content:center;cursor:pointer;font-size:16px;min-height:4rem;font-weight:500;text-decoration:underline}:root .mealz-recap-page__main__container .mealz-recap-page__sub__container .mealz-recap-page__sub__container__left .mealz-recap-page__left__button__raw .mealz-recap-page__raw__continue__button :before{left:8px;top:4px;position:absolute;content:url(https://storage.googleapis.com/assets.miam.tech/coursesu/icons/Caret.svg)}:root .mealz-recap-page__main__container .mealz-recap-page__sub__container .mealz-recap-page__sub__container__left .mealz-recap-page__left__button__raw .mealz-recap-page__raw__remove__all__button{display:none}:root .mealz-recap-page__main__container .mealz-recap-page__sub__container .mealz-recap-page__sub__container__right{display:none}@media(max-width:1022px){:root .mealz-recap-page__main__container{margin-left:unset;padding-top:unset}:root .mealz-recap-page__main__container .mealz-recap-page__sub__container .mealz-recap-page__sub__container__left{margin:0}:root .mealz-recap-page__main__container .mealz-recap-page__sub__container .mealz-recap-page__sub__container__left .mealz-recap-page__left__recipe__block{padding:42px 0 0}}:root .mealz-catalog-list .mealz-catalog__title-container{padding:0 20px}:root .mealz-catalog-list .mealz-catalog__title-container .mealz-catalog__title-icon{padding:8px;width:40px!important;height:40px!important;background-color:unset!important}:root .mealz-catalog-list .mealz-catalog__title-container .mealz-catalog__title-icon img{width:16px;height:16px}:root .mealz-catalog-list .mealz-catalog__title-container .mealz-catalog__title{color:#000;font-size:20px;font-style:normal;font-weight:700;line-height:120%}:root .mealz-catalog-list .mealz-catalog__title-container .mealz-catalog__subtitle{color:#575756;font-family:Open Sans Regular,sans-serif;font-size:14px;font-style:normal;font-weight:400;line-height:150%}:root .mealz-catalog__list__empty .mealz-catalog__list__empty__icon{content:url(https://storage.googleapis.com/assets.miam.tech/coursesu/images/emptySearchIcon.svg);width:180px!important;height:180px!important}:root{--mealz-ds-color-primary: #007d8f !important;--mealz-ds-color-neutral-white: #FFF !important;--mealz-ds-color-success: #D4F8DD !important;--mealz-ds-color-success-text: #62BD79 !important;--mealz-ds-color-danger: #faeaea !important;--mealz-ds-color-danger-text: #ec0000 !important;--mealz-ds-color-warning: #FFE4D0 !important;--mealz-ds-color-warning-text: #F3831B !important;--mealz-ds-color-background-secondary: #E4EAEC !important;--mealz-ds-color-primary-100: #EDEDED !important;--mealz-ds-color-neutral-black: #000 !important;--mealz-recipe-card-height: 330px}@media(max-width:1023px){:root{--mealz-recipe-card-height: 264px}}:root{--mealz-recipe-card-width: calc( 1660px / 6)}@media(max-width:2046px){:root{--mealz-recipe-card-width: calc( calc(100vw - 404px) / 6)}}@media(max-width:1586px){:root{--mealz-recipe-card-width: calc((100vw - 388px)/5) }}@media(max-width:1370px){:root{--mealz-recipe-card-width: calc((100vw - 372px)/4) }}@media(max-width:1114px){:root{--mealz-recipe-card-width: calc( calc(100vw - 356px) / 3)}}@media(max-width:1023px){:root{--mealz-recipe-card-width: calc( calc(100vw - 340px) / 3)}}@media(max-width:850px){:root{--mealz-recipe-card-width: calc( calc(100vw - 56px) / 3)}}@media(max-width:581px){:root{--mealz-recipe-card-width: calc((100vw - 48px)/2) }}:root #idees-repas p{font-size:unset!important;margin:unset!important}:root #idees-repas .experience-region p{font-size:1.1em!important;margin:0!important}:root .mealz-ds-text{font-family:Mulish,sans-serif}:root .mealz-ds-text.size-xl{font-size:20px}:root .mealz-ds-text.weight-xxl{font-weight:600}:root .mealz-ds-text.weight-l{font-weight:400}:root .mealz-ds-button{font-family:Open Sans Regular,sans-serif;font-weight:600}:root .account-dropdown-wrapper .account-link{align-items:center}')),document.head.appendChild(e)}}catch(a){console.error("vite-plugin-css-injected-by-js",a)}}();
2
+ import"./mealz-injector-runtime.js";import{e}from"./mealz-injector-environment.js";function t(){(function(){if(o()&&i())return!0;if(Array.isArray(window.dataLayer)){const e=window.dataLayer?.find(e=>"purchase"===e[1]);if(e)return console.log("[Mealz] fallback to dataLayer check hasPayment"),!0}return!1})()&&window.mealz.basketSync.handlePayment(r())}function n(e){window.partners.setQuantityOfProducts(e.map(e=>({pid:e.id,quantity:(a()?.find(t=>t.id===e.id)?.quantity||0)+e.quantity})))}function a(){return window.partners.returnCartDetails().map(e=>({id:e.productId,quantity:e.quantity}))}function r(){if(o()&&i())return window.tc_vars.order_total_amount_ati;if(Array.isArray(window.dataLayer)){const e=window.dataLayer?.find(e=>"purchase"===e[1]);if(e)return console.log("[Mealz] fallback to dataLayer check paymentTotal"),e[2].value}return window.tc_vars?.basket_amount||0}function o(){try{return window.tc_vars&&"e3_confirmation"===window.tc_vars.page_type}catch(e){return console.warn("[Mealz] Error checking confirmation page:",e),!1}}function i(){try{return window.tc_vars&&window.tc_vars.order_total_amount_ati&&"number"==typeof window.tc_vars.order_total_amount_ati&&window.tc_vars.order_total_amount_ati>0}catch(e){return console.warn("[Mealz] Error checking order amount:",e),!1}}let s;function c(){return new Promise(e=>{const t=function(){const e=window.location.href,t="https://storage.googleapis.com/assets.miam.tech/coursesu/config/prod/config.json";return e.includes("https://qualif.coursesu.com/")?"https://storage.googleapis.com/assets.miam.tech/coursesu/config/qualif/config.json":(e.includes("https://www.coursesu.com/"),t)}();let n=new XMLHttpRequest;n.open("GET",t),n.onload=()=>{s=JSON.parse(n.responseText),e()},n.onerror=()=>{s={available_stores:[],available_shelves:[],available_searches:[]},e()},n.send()})}async function l(){null==s&&await c()}const u="__mealzLoadedModuleScripts";function d(){const e="undefined"!=typeof window?window:globalThis;if(!e[u])try{Object.defineProperty(e,u,{value:new Set,writable:!1,enumerable:!1,configurable:!1})}catch(t){e[u]=new Set}return e[u]}function m(e){if(!e||"undefined"==typeof document)return Promise.resolve(!1);const t=d();return t.has(e)||function(e){try{const t=document.querySelectorAll("script[src]");return Array.from(t).some(t=>t.getAttribute("src")===e)}catch(t){return!1}}(e)?(t.add(e),Promise.resolve(!1)):new Promise((t,n)=>{try{const a=document.createElement("script");a.type="module",a.src=e,a.onload=()=>{d().add(e),t(!0)},a.onerror=t=>{d().add(e),n(t)},document.head.appendChild(a)}catch(a){n(a)}})}async function f(e){if("string"!=typeof e||!e)return[];try{const t=(new DOMParser).parseFromString(e,"text/html");return await async function(e){if(!e||"function"!=typeof e.querySelectorAll)return[];const t=Array.from(e.querySelectorAll('script[type="module"][src]')),n=Array.from(new Set(t.map(e=>e.getAttribute("src")).filter(Boolean)));return await Promise.all(n.map(e=>m(e)))}(t)}catch(t){const n=[],a=/<script[^>]*type=["']module["'][^>]*src=["']([^"']+)["'][^>]*>/gi;let r;for(;null!==(r=a.exec(e));)r[1]&&n.push(r[1]);const o=Array.from(new Set(n));return await Promise.all(o.map(e=>m(e)))}}const p="_mealz/injector/session-id";function h(){let e=sessionStorage.getItem(p);if(e)return e;const t=`sid-${Date.now()}-${Math.random().toString(16).slice(2)}`;e=crypto?.randomUUID?.()??t;try{sessionStorage.setItem(p,e)}catch(n){console.debug("[Mealz] sessionStorage setItem failed for sessionId")}return e}const g="_mealz/injector/authless-id";let w=null;async function y(t,n){const a=sessionStorage.getItem(g);return a||(w||(w=async function(t,n){const a=n??e?.ssr?.baseUrl;if(!a)throw new Error("[Mealz] baseUrl not configured");const r=`${a}/v3/generate-authless-token`,o=await fetch(r,{method:"GET",headers:{"supplier-token":t}});if(!o.ok)throw new Error(`[Mealz] ${r} fetch failed: ${o.status} ${o.statusText}`);const i=await o.json(),s=i?.authless_id;if(!s)throw new Error("[Mealz] generate-authless-token response missing authless_id");return s}(t,n).then(e=>{try{sessionStorage.setItem(g,e)}catch(t){console.debug("[Mealz] sessionStorage setItem failed for authless-id")}return e}).finally(()=>{w=null}),w))}async function _({language:e,supplierToken:t,userId:n,sessionId:a,extraHeaders:r={},baseUrl:o}){const i={"language-id":e,"Supplier-token":t,"session-id":a,...r};return n?(!function(){try{sessionStorage.removeItem(g)}catch(e){console.debug("[Mealz] sessionStorage removeItem failed for authless-id")}}(),i.authorization="user_id "+n):i["authless-id"]=await y(t,o),i}async function b(t,n,a={},r){const o=r??e?.ssr?.baseUrl;if(!o)throw new Error("[Mealz] baseUrl not configured");const i=new URLSearchParams;Object.entries(a).forEach(([e,t])=>{null!=t&&""!==t&&i.append(e,String(t))});const s=`${o}${t}?${i.toString()}`;return fetch(s,{method:"GET",headers:n}).then(async e=>{if(!e.ok)throw new Error(`[Mealz] ${s} fetch failed: ${e.status} ${e.statusText}`);const t=await e.text();return await f(t),t})}async function v(t,n){const a=n??e?.ssr?.baseUrl;if(!a)throw new Error("[Mealz] baseUrl not configured");const r=`${a}${t}`,o=await fetch(r,{method:"GET"});if(!o.ok)throw new Error(`[Mealz] ${r} fetch failed: ${o.status} ${o.statusText}`);const i=await o.json(),s=i?.links;if(!Array.isArray(s))throw new TypeError("[Mealz] styles response missing links array");!function(e){const t=document.head;if(!t)return;const n=new Set([...t.querySelectorAll('link[rel="stylesheet"]')].map(e=>e.href));for(const a of e){if(!a||n.has(a))continue;const e=document.createElement("link");e.rel="stylesheet",e.href=a,t.appendChild(e),n.add(a)}}(s)}function z(e,{maxAttempts:t=20,intervalMs:n=250}={}){return new Promise(a=>{let r=0;const o=()=>{const i=document.querySelector(e);return i?a(i):(r+=1,r>=t?a(null):void setTimeout(o,n))};o()})}const S={dev:"http://localhost:3002",uat:"https://ssr-api-uat.mealz.ai",prod:"https://ssr-api.mealz.ai"},M={supplierId:7,origin:"coursesu",noSupplier:!1,orderHistory:!0};function E(){return function(){const e=globalThis.document?.documentElement?.getAttribute?.("data-mealz-injector-env");if("dev"===e||"uat"===e||"prod"===e)return e}()??function(){try{return"www.coursesu.com"===new URL(globalThis.location.href).hostname?"prod":"uat"}catch{return"uat"}}()}function T(){return S[E()]}function k(){const e="prod"===E()?"miam.coursesu.web":"miam.test";return btoa(JSON.stringify({...M,domain:e}))}function C(e){const t="string"==typeof document?.cookie?document.cookie:"";if(!t)return;const n=t.split(";");for(const a of n){const t=a.trim();if(!t)continue;const n=t.indexOf("=");if(-1===n)continue;if(t.substring(0,n).trim()===e){const e=t.substring(n+1);return decodeURIComponent(e)}}}function I(){return C("storeId")}async function P(){return(await async function(){return await l(),s.available_stores}()).includes(I())}function L(e,t,n,a,r){const o=setInterval(()=>{void 0!==e[t]||0==a?(clearInterval(o),r(e[t])):a--},n)}const A="_mealz/injector/ab",B="_mealz/injector/ab/planner-entry";function j(){const e=globalThis.mealz,t=!function(){const e=C("TC_PRIVACY_CENTER");return!!e&&e.split(",").includes("1")}();if(!0===globalThis.loggedIn&&globalThis.tc_vars?.user_id)return void e.user.updateForbidProfiling(t,globalThis.tc_vars.user_id,!1);const n=sessionStorage.getItem(g);n&&e.user.updateForbidProfiling(t,n,!0)}function R(){globalThis.mealz.basketSync.definePushProductsToCart(n),t(),function(){let e=document.getElementsByClassName("mini-cart")[0];if(e||(e=document.getElementsByClassName("cart-content-left-wrapper")[0]),!e)return void console.error("[Mealz] could not find coursesu basket element to listen for change, sync is broken");new MutationObserver(()=>{window.mealz.basketSync.retailerBasketChanged(a())}).observe(e,{attributes:!1,childList:!0,subtree:!0}),window.mealz.basketSync.retailerBasketChanged(a())}(),function(){const e=()=>window.mealz.basket.reset();new MutationObserver(()=>{const t=document.querySelector("[data-empty-cart-confirm]");t&&null!==t.offsetParent&&t.addEventListener("click",e)}).observe(document.body,{attributes:!1,childList:!0,subtree:!0})}(),location.href.includes("/paiement")?sessionStorage.getItem("_mealz/injector/lastUrlWasPayment")||(window.mealz.paymentStarted(r()),sessionStorage.setItem("_mealz/injector/lastUrlWasPayment","true")):sessionStorage.removeItem("_mealz/injector/lastUrlWasPayment")}async function $(){const e=globalThis.mealz,t=await async function(){return await l(),s.ab}();if(t){if(console.debug("[Mealz Injector] A/B testing: config found",t),!localStorage.getItem(A)){const e=Object.keys(t).length,n=Math.floor(Math.random()*e),a=Object.keys(t)[n];localStorage.setItem(A,a)}const n=localStorage.getItem(A);console.debug("[Mealz Injector] A/B testing: User set to version",n),e.analytics.setAbTestKey(n),function(e){if(!e)return void console.debug("[Mealz Injector] A/B testing: loading no css file");console.debug("[Mealz Injector] A/B testing: loading css file",e);const t=document.head,n=document.createElement("link");n.type="text/css",n.rel="stylesheet",n.href=e,t.appendChild(n)}(t[n])}else console.debug("[Mealz Injector] A/B testing: no config found"),localStorage.removeItem(A);const n=function(e){if(Array.isArray(e))return e.map(e=>String(e).trim()).filter(Boolean);if(e&&"object"==typeof e)return Object.keys(e).map(e=>String(e).trim()).filter(Boolean);return[]}(await async function(){return await l(),s.planner_entry_ab}());if(0===n.length)return void localStorage.removeItem(B);const a=localStorage.getItem(B);if(a&&n.includes(a))return;const r=n[Math.floor(Math.random()*n.length)];localStorage.setItem(B,r)}async function O(){const e=globalThis.mealz;e.config.mealzLogs("none");try{await $()}catch(t){console.warn("[Mealz Injector] A/B testing initialization failed, continuing without it:",t)}e.hook.setHookCallback((e,t)=>function(e,t){return e?!!t||(0===I()?.length&&document.querySelector(".change-store-new").click(),!1):(document.querySelector("[data-login]").click(),!1)}(e,t)),e.hook.setForcePosCallback(e=>async function(e){const n=document.getElementsByName("csrf_token")[0].value,a=`https://www.coursesu.com/on/demandware.store/Sites-DigitalU-Site/fr_FR/StoreLocator-SetStore?format=ajax&store_id=${e}&csrf_token=${encodeURI(n)}`;try{const e=await fetch(a,{credentials:"include",headers:{"User-Agent":"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:124.0) Gecko/20100101 Firefox/124.0",Accept:"*/*","Accept-Language":"fr,fr-FR;q=0.8,en-US;q=0.5,en;q=0.3","Content-Type":"application/json","X-Requested-With":"XMLHttpRequest","Sec-Fetch-Dest":"empty","Sec-Fetch-Mode":"no-cors","Sec-Fetch-Site":"same-origin",Pragma:"no-cache","Cache-Control":"no-cache"},referrer:"https://www.coursesu.com/recherche-tout-en-un",method:"GET",mode:"cors"});e.ok?globalThis.location.reload():console.error("Failed to set store. Status:",e.status)}catch(t){console.error("An error occurred while setting the store:",t)}}(e)),j(),R(),function(){const e=globalThis.mealz;e.router.setRecipeCatalogUrl("/idees-repas.html"),e.router.setRetailerCartUrl("/panier")}()}const U={home:{section:"",htmlEndpoint:"/v3/catalog",stylesEndpoint:"/v3/styles/catalog/catalog-home"},list:{section:"liste",htmlEndpoint:"/v3/catalog/list",stylesEndpoint:"/v3/styles/catalog/catalog-list"},category:{section:"categorie",htmlEndpoint:"/v3/catalog/category",stylesEndpoint:"/v3/styles/catalog/catalog-category"},mySpace:{section:"mon-carnet",htmlEndpoint:"/v3/catalog/my-space",stylesEndpoint:"/v3/styles/catalog/my-space"}};function x(){const e=new URLSearchParams(globalThis.location.search),t={};for(const[a,r]of e.entries())"section"!==a&&(t[a]=r);var n;return t.categorie&&!t.category_id&&(t.category_id=(n=t.categorie,n.match(/(?:^|\/)(\d+)\/?$/)?.[1]??n),delete t.categorie),t}const q="webc-miam-recipe-catalog";async function H(e){const t=await z(q,{maxAttempts:20,intervalMs:250});if(t)try{const{htmlEndpoint:n,stylesEndpoint:a}=function(){const e=new URLSearchParams(globalThis.location.search).get("section");return Object.values(U).find(({section:t})=>t===e)??U.home}();v(`${a}?recipe_card_variant=2`,T());const r=await b(n,e,{max_recipes_per_category:6,recipe_card_variant:2,planner_entry_variant:1,store_id:I(),...x()},T());t.insertAdjacentHTML("afterend",r),t.remove()}catch(n){console.error("[CoursesU] catalog SSR injection failed",n)}else console.warn(`[CoursesU] ${q} not found`)}function N(){const e=document.querySelector("[data-header]");if(!e)return;new MutationObserver(()=>{const t=e.getBoundingClientRect().bottom;t>=0?globalThis.mealz.setStickyHeaderHeight(t):(globalThis.mealz.setStickyHeaderHeight(0),F())}).observe(e.parentElement,{attributes:!0,childList:!0,subtree:!0})}function F(e=50){const t=document.querySelector("[data-header]");e>0&&t&&setTimeout(()=>{const n=t.getBoundingClientRect().bottom;globalThis.mealz.setStickyHeaderHeight(Math.max(n,0)),F(e-1)},15)}const D="webc-miam-meals-planner";const G=document.createRange().createContextualFragment(`\n <div class='mealz-recap-page-header'>\n <div class='mealz-recap-page-header__breadcrumbs'>\n <div class="mealz-recap-page-header__breadcrumbs__home" href='${globalThis.location.origin}'></div>\n <div class="mealz-recap-page-header__breadcrumbs__caret"></div>\n <a href='${globalThis.location.origin}/mon-compte'> Mon compte </a>\n <div class="mealz-recap-page-header__breadcrumbs__caret"></div>\n <a> Mes repas </a>\n </div>\n <div class='mealz-recap-page-header__title'>\n <span>Mes repas (<span id="mealzMesRepasRecipeCounter" class="mealz-recipe-counter"></span>)\n </div>\n <div class='mealz-recap-page-header__subtitle'>\n Les ingrédients pour ces recettes sont actuellement dans votre panier.\n Retrouvez ici le détail des recettes pour les réaliser chez vous.\n </div>\n </div>\n <div class="mealz-recap-page__main__container">\n <div class="mealz-recipes-page__header">\n <div id="catalogButton" class="mealz-recipes-page__tab">\n Recettes\n </div>\n <div id="recipeRecapButton" class="mealz-recipes-page__tab mealz-recipes-page__tab__curent">\n Mes repas\n </div>\n </div>\n <div class="mealz-recap-page__sub__container">\n <div class="mealz-recap-page__sub__container__left">\n <div class="mealz-recap-page__left__header ">\n <h1 id='recapPageLeftHeader'>\n </h1>\n </div>\n <div class="mealz-recap-page__left__recipe__block">\n <p id="previewBlockHeader" class="mealz-recap-page__recipe__block__header">\n Vous avez sélectionné <span id="nbOfMeals"></span> repas. <br />\n On y jette un dernier petit coup d'oeil ?\n </p>\n \x3c!-- TODO: fetch preview block from API --\x3e\n <webc-miam-basket-preview-block></webc-miam-basket-preview-block>\n </div>\n <div class="mealz-recap-page__left__button__raw">\n <div class="mealz-recap-page__raw__continue__button">\n <span id="continueButton">\n Continuer mes achats\n </span>\n </div>\n <button class="mealz-recap-page__raw__remove__all__button">\n <span id="removeAllButton">\n Retirer tous les repas\n </span>\n </button>\n </div>\n </div>\n <div class="mealz-recap-page__sub__container__right">\n <div class="mealz-recap-page__right__card">\n <h3 class="mealz-recap-page__right__card__header">\n Récapitulatif des repas\n </h3>\n <hr class="mealz-recap-page__right__card__divider">\n <p id="rightCardStats" class="mealz-recap-page__right__card__stats">\n </p>\n <div class="mealz-recap__card__comfirm_raw">\n <button id="confirmOrderButton">\n <span id="confirmOrderText">OK, voir mon panier</span>\n </button>\n </div>\n \x3c!-- <p id="rightCardFooter" class="mealz-recap__right__card__footer"></p> --\x3e\n </div>\n </div>\n </div>\n `);let W=0;function J(){!function(){const e=document.getElementById("primary");if(!e)return;K(globalThis.mealz.basket.recipeCount()?.value),function(){const e=G.getElementById("confirmOrderButton"),t=G.getElementById("continueButton"),n=G.getElementById("removeAllButton");e.addEventListener("click",()=>location.href="/panier",!1),t.addEventListener("click",()=>location.href="/",!1),n.addEventListener("click",()=>globalThis.mealz.basket.reset(),!1)}(),e.replaceWith(G)}(),globalThis.mealz.basket.recipeCount().subscribe(e=>K(e));const e=document.getElementsByClassName("mealz-recap-page__left__recipe__block")[0];new MutationObserver(X).observe(e,{attributes:!1,childList:!0,subtree:!0});!function(e){const t=globalThis.mealz.basket.recipeCount()?.value;0==t&&e.classList.add("mealz-hidden"),e.innerHTML=t,globalThis.mealz.basket.recipeCount().subscribe(t=>{e.innerHTML=t,0==t?e.classList.add("mealz-hidden"):e.classList.remove("mealz-hidden")})}(document.getElementById("mealzMesRepasRecipeCounter"))}function X(){const e=Array.from(document.getElementsByClassName("mealz-recap-page__left__recipe__block")[0].getElementsByClassName("mealz-basket-preview-line clickable"));W<e.length&&e.forEach(e=>e.addEventListener("click",()=>globalThis.mealz.recipes.openDetails(e.id))),W=e.length}function K(e){const t=document.getElementsByClassName("mealz-recap-page__main__container")[0];if(!t)return;const n=t.getElementById("previewBlockHeader"),a=t.getElementById("recapPageLeftHeader"),r=t.getElementById("rightCardStats"),o=t.getElementById("removeAllButton");if(e>0){const i=t.getElementById("nbOfMeals");n.classList.remove("mealz-hidden"),o.classList.remove("mealz-hidden"),a.innerHTML="Avant de passer au panier...",i.innerHTML=e,r.innerHTML=`${e} repas`}else n.classList.add("mealz-hidden"),o.classList.add("mealz-hidden"),a.innerHTML="Mes repas",r.innerHTML="0 repas, 0 produits"}const V="/v3/recipe-card/multiple";let Q=[],Y=null;const Z=new Set;let ee=null,te=null;async function ne(){if(await P()){Q=re(),oe();new MutationObserver(()=>{clearTimeout(ee),ee=setTimeout(()=>oe(),100)}).observe(document.body,{attributes:!1,childList:!0,subtree:!0});new MutationObserver(()=>{clearTimeout(te),te=setTimeout(()=>async function(){await P()||document.querySelectorAll(".miamRecipeCardContainer").forEach(e=>e.remove())}(),100)}).observe(document.body,{attributes:!1,childList:!0,subtree:!0})}}async function ae(e){if(!(await P()))return;const t=await z(".tiles-container",{maxAttempts:20,intervalMs:250});if(t)try{v("/v3/styles/recipe-card/multiple?recipe_card_variant=2",T());const n=function(e){const t=se(e),n=[];return re().forEach(e=>{const a=t[e.positionOfPrecedingProduct],r=t[e.positionOfPrecedingProduct+1];if(!a||!r)return;const o=ce([a,r]);0!==o.length&&""!==o[0]&&n.push({position:e.cardPosition,productIds:o})}),n}(t.children);if(0===n.length)return;const a=await function(e,t){const n=T();if(!n)throw new Error("[Mealz] baseUrl not configured");const a=new URLSearchParams({variant:String(2),store_id:I()}),r=`${n}${V}?${a.toString()}`;return fetch(r,{method:"POST",headers:{"Content-Type":"application/json",...e},body:JSON.stringify({contexts:t})}).then(async e=>{if(!e.ok)throw new Error(`[Mealz] ${r} fetch failed: ${e.status} ${e.statusText}`);const t=await e.json();return t?.data??[]})}(e,n);await Promise.all(a.map(({html:e})=>f(e))),Y=Object.fromEntries(a.map(({position:e,html:t})=>[Number(e),t]))}catch(n){console.warn("[Mealz] recipe cards SSR prefetch failed",n)}else console.warn("[Mealz] .tiles-container not found for recipe cards")}function re(){return[3,9,21,28].map((e,t)=>({positionOfPrecedingProduct:e,cardPosition:e+t+1}))}async function oe(){if(await P()){const e=ie();e&&e.children&&Q.forEach(e=>{!function(e){if(Z.has(e.cardPosition))return;const t=ie(),n=function(e){return Array.from(e).filter(e=>!!e.dataset.tcProductTile||!!e.dataset.intendedPosition)}(t.children)[e.cardPosition];if(n&&+n.dataset.intendedPosition===e.cardPosition)return;n&&+n.dataset.intendedPosition!==e.cardPosition&&function(e){const t=ie(),n=se(t.children),a=n[e.positionOfPrecedingProduct],r=n[e.positionOfPrecedingProduct+1];if(a&&r){let t=function(e){return document.querySelector(`[data-intended-position="${e.cardPosition}"]`)}(e);if(!t){const n=ce([a,r]);0!==n.length&&""!==n[0]&&(t=function(e,t){const n=Y?.[t];if(!n)return null;const a=document.createElement("li");return a.classList.add("grid-tile","small-6","medium-6"),a.innerHTML=n,a}(0,e.cardPosition),t&&(t.dataset.intendedPosition=e.cardPosition))}t&&a.after(t)}}(e)}(e)})}}function ie(){return document.getElementsByClassName("tiles-container")[0]}function se(e){return Array.from(e).filter(e=>!!e.dataset.tcProductTile)}function ce(e){return e.map(e=>e.querySelector("[data-product-tile]")?.dataset.itemid||"")}const le="/v3/recipe-tags";let ue=null,de=!1,me=!1;function fe(){return globalThis.location.href.includes("/panier")}async function pe(e){if(!fe())return;if(!I())return;if(!(await z(".cart-content-left-wrapper",{maxAttempts:20,intervalMs:250})))return void console.warn("[CoursesU] .cart-content-left-wrapper not found for recipe tags");const t=function(){const e=[...document.getElementsByClassName("cart-row")].map(e=>e.dataset.itemid).filter(Boolean);return[...new Set(e)]}();if(0!==t.length)try{v("/v3/styles/recipe-tag",T());const n=await function(e,t){const n=T();if(!n)throw new Error("[Mealz] baseUrl not configured");const a=new URLSearchParams({store_id:I(),product_ids:JSON.stringify(t)}),r=`${n}${le}?${a.toString()}`;return fetch(r,{method:"GET",headers:e}).then(async e=>{if(!e.ok)throw new Error(`[Mealz] ${r} fetch failed: ${e.status} ${e.statusText}`);const t=await e.json();return t?.data??[]})}(e,t);await Promise.all(n.map(({html:e})=>f(e))),ue=Object.fromEntries(n.map(({productId:e,html:t})=>[e,t]))}catch(n){console.warn("[CoursesU] recipe tags SSR prefetch failed",n)}else ue={}}function he(){me=!1,de=!0;try{!function(){if(!ue)return;!function(){const e=document.getElementsByClassName("cart-row");[...e].forEach(e=>{if(e.querySelector(".mealz-recipe-tag-container"))return;const t=document.createRange().createContextualFragment('<div class="mealz-recipe-tag-container"></div>');e.appendChild(t)})}();[...document.getElementsByClassName("cart-row")].forEach(e=>{const t=e.dataset.itemid,n=e.querySelector(".mealz-recipe-tag-container");n&&t&&(n.querySelector("mealz-recipe-tag")||(n.innerHTML=ue[t]??""))})}()}catch(e){console.warn("[CoursesU] recipe-tags injection failed",e)}finally{de=!1,me&&he()}}const ge=[],we=new Map,ye=new Map;let _e=null,be=!1,ve=null,ze=!1;const Se=[{href:/\/mieux-consommer\//,waitSelector:".recipe-tile",findRecipes:()=>Array.from(document.getElementsByClassName("recipe-tile")).map(e=>({name:e.querySelector("h2.recipe-name").textContent.trim(),parentElement:e.getElementsByClassName("recipe-details")[0]}))},{href:/\/Recette_[^/]+\.html/,waitSelector:".recipe-main-header",findRecipes:()=>[{name:document.getElementsByClassName("recipe-main-header")[0].children[0].textContent.trim(),parentElement:document.querySelector("div.entry--key-information")}]}];function Me(){return Se.some(e=>globalThis.location.href.match(e.href))}function Ee(){return Se.find(e=>globalThis.location.href.match(e.href))}function Te(){const e=Ee();return e?e.findRecipes().filter(e=>e.name&&e.parentElement):[]}async function ke(e,t){if(we.has(t))return we.get(t);if(ye.has(t))return ye.get(t);const n=b("/v3/recipe-card-cta",e,{recipe_name:t,store_id:I()},T()).then(e=>(we.set(t,e),ye.delete(t),e)).catch(e=>{throw ye.delete(t),e});return ye.set(t,n),n}async function Ce(e){_e=e,be||(be=!0,v("/v3/styles/recipe-card/recipe-card-cta",T())),await async function(){const e=Ee();e?.waitSelector&&await z(e.waitSelector,{maxAttempts:20,intervalMs:250})}();const t=Te(),n=[...new Set(t.map(e=>e.name))];await Promise.all(n.map(async t=>{try{await ke(e,t)}catch(n){console.warn(`[CoursesU] order-button SSR prefetch failed for recipe "${t}"`,n)}}))}function Ie(){ze||(ze=!0,new MutationObserver(()=>{clearTimeout(ve),ve=setTimeout(()=>Pe(),100)}).observe(document.body,{attributes:!1,childList:!0,subtree:!0})),Pe()}function Pe(){Te().forEach(e=>{ge.includes(e.parentElement)||(ge.push(e.parentElement),e.name&&async function(e,t){try{let n=we.get(t);if(void 0===n&&_e&&(n=await ke(_e,t)),!n?.trim())return;const a=document.createElement("div");a.classList.add("mealz-button-parent-card-container"),a.insertAdjacentHTML("beforeend",n),e.parentElement.appendChild(a)}catch(n){console.warn(`[CoursesU] order-button SSR injection failed for recipe "${t}"`,n)}}(e,e.name))})}const Le="data-mealz-ssr-pending";let Ae=!1,Be=!1,je=null,Re=null;const $e=new Map,Oe=new Map;function Ue(e){return e.getAttribute("recipe-id")||e.recipeId||""}function xe(e,t){e.setAttribute(Le,t)}async function qe(e,t,n){try{const a=await async function(e,t){if($e.has(t))return $e.get(t);if(Oe.has(t))return Oe.get(t);const n=b("/v3/recipe-card",e,{recipe_id:t,store_id:I(),variant:String(2)},T()).then(e=>($e.set(t,e),Oe.delete(t),e)).catch(e=>{throw Oe.delete(t),e});return Oe.set(t,n),n}(e,n);!function(e,t){const n=document.createRange().createContextualFragment(t);e.replaceWith(n)}(t,a)}catch(a){!function(e){e.removeAttribute(Le)}(t),console.warn(`[CoursesU] recipe-card-by-id SSR failed for recipe ${n}`,a)}}async function He(e){Re=e,function(e){Be||(Be=!0,Re=e,new MutationObserver(()=>{clearTimeout(je),je=setTimeout(()=>He(Re),100)}).observe(document.body,{attributes:!1,childList:!0,subtree:!0}))}(e);const t=[...document.querySelectorAll(`webc-miam-recipe-card[recipe-id]:not([${Le}])`)];if(0===t.length)return;Ae||(Ae=!0,v("/v3/styles/recipe-card?variant=2",T()));const n=new Map;for(const a of t){const e=Ue(a);e&&(xe(a,e),n.has(e)||n.set(e,[]),n.get(e).push(a))}await Promise.all([...n.entries()].flatMap(([t,n])=>n.map(n=>qe(e,n,t))))}function Ne(){return window.location.href.includes("/idees-repas.html")}async function Fe(e){const t=await async function(e){return _({language:"fr",supplierToken:k(),userId:!0===globalThis.loggedIn&&null!=e?String(e):void 0,sessionId:h(),baseUrl:T()})}(e);Ne()?await H(t):window.location.href.includes("/budget-repas.html")?await async function(e){const t=await z(D,{maxAttempts:20,intervalMs:250});if(t)try{v("/v3/styles/planner",T());const n=await b("/v3/planner",e,{store_id:I()},T());t.insertAdjacentHTML("afterend",n),t.remove()}catch(n){console.error("[Mealz] planner SSR injection failed",n)}else console.warn(`[Mealz] ${D} not found`)}(t):window.location.href.includes("/panier")?await pe(t):await ae(t),Me()&&(0===I()?.length||await P())&&await Ce(t),await He(t)}var De;De=async e=>{await async function(e){localStorage.removeItem("_miam/preferences/guests"),localStorage.removeItem("_miam/preferences");const t=!0===globalThis.loggedIn,n=T();if(n&&null!=e&&t)try{await fetch(`${n}/v3/cache/remove`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({userId:String(e),key:"preferences"})})}catch(a){console.debug("[Mealz Injector] Failed to clear SSR preferences cache",a)}}(e),await v("/v3/styles/base",T());const t=!0===globalThis.loggedIn?e:void 0;var n;await Fe(t),n=async()=>{try{await O()}catch(e){console.error("[Mealz Injector] Error in main script initialization:",e)}window.location.href.includes("mes-repas")&&J(),(0===I()?.length||await P())&&(await ne(),function(){if(!fe())return;const e=document.getElementsByClassName("cart-content-left-wrapper")[0];e&&(new MutationObserver(()=>{de?me=!0:he()}).observe(e,{attributes:!1,childList:!0,subtree:!0}),he())}(),Me()&&Ie(),Ne()&&N())},L(globalThis,"mealz",100,50,e=>{void 0!==e?n():console.error("[Mealz Injector] globalThis.mealz never became available")})},L(window,"tc_vars",100,25,e=>{e&&L(window.tc_vars,"user_id",100,25,De)});
3
+ //# sourceMappingURL=mealz-injector-coursesu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mealz-injector-coursesu.js","sources":["../src/retailers/coursesu/basket-sync.js","../src/retailers/coursesu/config-file.js","../src/core/common/ssr-scripts.js","../src/core/common/ssr-utils.js","../src/retailers/coursesu/coursesu-env.js","../src/retailers/coursesu/utils.js","../src/retailers/coursesu/init-mealz.js","../src/retailers/coursesu/catalog-routing.js","../src/retailers/coursesu/catalog.js","../src/retailers/coursesu/planner.js","../src/retailers/coursesu/recipe-recap.js","../src/retailers/coursesu/recipe-cards.js","../src/retailers/coursesu/recipe-tags.js","../src/retailers/coursesu/order-buttons.js","../src/retailers/coursesu/recipe-card-by-id.js","../src/retailers/coursesu/main.js"],"sourcesContent":["////////////////////////////////////////////////////\n///////////////////METHODS TO CALL//////////////////\n////////////////////////////////////////////////////\n\nexport function resetOnEmptyBasket() {\n const resetBasket = () => window.mealz.basket.reset();\n const observer = new MutationObserver(() => {\n const button = document.querySelector('[data-empty-cart-confirm]');\n // if button.offsetParent !== null means that the button is visible\n if (button && button.offsetParent !== null) {\n button.addEventListener('click', resetBasket);\n }\n });\n observer.observe(document.body, { attributes: false, childList: true, subtree: true });\n}\n\nexport function handlePayment() {\n if (hasPayment()) {\n window.mealz.basketSync.handlePayment(paymentTotal());\n }\n}\n\nexport function handlePaymentStarted() {\n if (location.href.includes('/paiement')) {\n if (!sessionStorage.getItem('_mealz/injector/lastUrlWasPayment')) {\n window.mealz.paymentStarted(paymentTotal());\n sessionStorage.setItem('_mealz/injector/lastUrlWasPayment', 'true');\n }\n } else {\n sessionStorage.removeItem('_mealz/injector/lastUrlWasPayment');\n }\n}\n\n// Because we don't have found any other way to listen on CoursesU's cart, we need to observe changes on their\n// element that displays the current cart's price\nexport function listenToRetailerBasket() {\n // Get cart display on most pages\n let mutationTarget = document.getElementsByClassName(\"mini-cart\")[0];\n if (!mutationTarget) {\n // Get cart display on /panier page\n mutationTarget = document.getElementsByClassName(\"cart-content-left-wrapper\")[0];\n }\n // If we still haven't found the display, there is no display, which means the user doesn't have any way to\n // update the cart so we return there\n if (!mutationTarget) {\n console.error(\"[Mealz] could not find coursesu basket element to listen for change, sync is broken\");\n return;\n }\n const observerOptions = { attributes: false, childList: true, subtree: true };\n const basketObserver = new MutationObserver(() => {\n // fetch the basket and send update to Mealz\n window.mealz.basketSync.retailerBasketChanged(getBasketProducts());\n });\n basketObserver.observe(mutationTarget, observerOptions);\n // Send the starting retailer basket\n window.mealz.basketSync.retailerBasketChanged(getBasketProducts());\n}\n\nexport function pushProductsToBasket(retailerProducts) {\n window.partners.setQuantityOfProducts(\n retailerProducts.map(p =>({\n pid: p.id,\n // CoursesU's method sets the quantity of the product passed but our SDK send a quantity to add or remove\n // (quantity = 5 -> add 5 ; quantity = -5 -> remove 5)\n // So we need to add the current quantity of the product in their basket to our quantity (or 0 if it wasn't in the basket)\n quantity: (getBasketProducts()?.find(product => product.id === p.id)?.quantity || 0) + p.quantity\n }))\n );\n}\n\n// Get basket content and return it as an array of {id, quantity}\nexport function getBasketProducts() {\n return window.partners.returnCartDetails().map(p => ({ id: p.productId, quantity: p.quantity }));\n}\n\n///////////////////////////////////////////////\n/////////////////USEFUL METHODS////////////////\n///////////////////////////////////////////////\n\nexport function hasPayment() {\n // Check if we're on confirmation page and order amount is present\n if (isOnConfirmationPage() && hasOrderAmount()) {\n return true;\n }\n\n // Fallback to dataLayer check for backward compatibility\n if (Array.isArray(window.dataLayer)) {\n const paymentEvent = window.dataLayer?.find((ev) => ev[1] === \"purchase\");\n if (paymentEvent) {\n console.log('[Mealz] fallback to dataLayer check hasPayment');\n return true;\n }\n }\n return false;\n}\n\nexport function paymentTotal() {\n // If we're on confirmation page, use order_total_amount_ati from tc_vars\n if (isOnConfirmationPage() && hasOrderAmount()) {\n return window.tc_vars.order_total_amount_ati;\n }\n\n // Fallback to dataLayer check for backward compatibility\n if (Array.isArray(window.dataLayer)) {\n const paymentEvent = window.dataLayer?.find((ev) => ev[1] === \"purchase\");\n if (paymentEvent) {\n console.log('[Mealz] fallback to dataLayer check paymentTotal');\n return paymentEvent[2].value;\n }\n }\n\n return window.tc_vars?.basket_amount || 0;\n}\n\n/**\n * Check if we're on the confirmation page\n * @returns {boolean} True if page_type is \"e3_confirmation\" (CoursesU's confirmation page)\n */\nexport function isOnConfirmationPage() {\n try {\n return window.tc_vars && window.tc_vars.page_type === 'e3_confirmation';\n } catch (error) {\n console.warn('[Mealz] Error checking confirmation page:', error);\n return false;\n }\n}\n\n/**\n * Check if order amount is present in tc_vars\n * @returns {boolean} True if order_total_amount_ati is present and valid (order amount all taxes included)\n */\nexport function hasOrderAmount() {\n try {\n return window.tc_vars && \n window.tc_vars.order_total_amount_ati && \n typeof window.tc_vars.order_total_amount_ati === 'number' && \n window.tc_vars.order_total_amount_ati > 0;\n } catch (error) {\n console.warn('[Mealz] Error checking order amount:', error);\n return false;\n }\n}\n","import \"regenerator-runtime/runtime\";\n\nlet _configJson;\n\nfunction _configUrl() {\n const location = window.location.href;\n const qualifUrl = 'https://qualif.coursesu.com/';\n const prodUrl = 'https://www.coursesu.com/';\n const qualifBucketPath = 'https://storage.googleapis.com/assets.miam.tech/coursesu/config/qualif/config.json';\n const prodBucketPath = 'https://storage.googleapis.com/assets.miam.tech/coursesu/config/prod/config.json';\n if (location.includes(qualifUrl)) {\n return qualifBucketPath;\n } else if (location.includes(prodUrl)) {\n return prodBucketPath;\n } else {\n // console.debug(\"Location not found, can't choose right config, using prod one\");\n return prodBucketPath;\n }\n}\n\nfunction _retrieveConfigJson() {\n return new Promise(resolve => {\n const url = _configUrl();\n let xhr = new XMLHttpRequest();\n xhr.open('GET', url);\n xhr.onload = () => {\n _configJson = JSON.parse(xhr.responseText);\n resolve();\n };\n xhr.onerror = () => {\n _configJson = _defaultJson();\n resolve();\n };\n xhr.send();\n });\n}\n\nfunction _defaultJson() {\n return {\n 'available_stores': [],\n 'available_shelves': [],\n 'available_searches': []\n };\n}\n\nasync function _retrieveConfigJsonIfNecessary() {\n if (_configJson == undefined) {\n await _retrieveConfigJson();\n }\n}\n\nexport async function getAvailableStores() {\n await _retrieveConfigJsonIfNecessary();\n return _configJson['available_stores']\n}\nexport async function getAvailableShelves() {\n await _retrieveConfigJsonIfNecessary();\n return _configJson['available_shelves']\n}\nexport async function getAvailableSearches() {\n await _retrieveConfigJsonIfNecessary();\n return _configJson['available_searches']\n}\nexport async function getAbCssUrl() {\n await _retrieveConfigJsonIfNecessary();\n return _configJson['ab']\n}\nexport async function getPlannerEntryAbVariants() {\n await _retrieveConfigJsonIfNecessary();\n return _configJson['planner_entry_ab']\n}","// Utility helpers to ensure <script type=\"module\" src=\"…\"> tags\n// found in SSR-injected HTML are actually fetched and executed.\n//\n// Browsers do not execute scripts added via innerHTML/insertAdjacentHTML.\n// These helpers parse the HTML, find external module scripts, and\n// programmatically append equivalent <script> tags to <head>, avoiding\n// duplicates and returning Promises for load completion.\n\nconst loadedScriptsKey = \"__mealzLoadedModuleScripts\";\n\nfunction getLoadedSet() {\n const w = typeof window !== \"undefined\" ? window : globalThis;\n if (!w[loadedScriptsKey]) {\n try {\n Object.defineProperty(w, loadedScriptsKey, {\n value: new Set(),\n writable: false,\n enumerable: false,\n configurable: false\n });\n } catch (_) {\n // Fallback if defineProperty fails\n w[loadedScriptsKey] = new Set();\n }\n }\n return w[loadedScriptsKey];\n}\n\nfunction hasScriptInDom(src) {\n try {\n const scripts = document.querySelectorAll(\"script[src]\");\n return Array.from(scripts).some((s) => s.getAttribute(\"src\") === src);\n } catch (_) {\n return false;\n }\n}\n\nfunction ensureModuleScriptLoaded(src) {\n if (!src || typeof document === \"undefined\") {\n return Promise.resolve(false);\n }\n\n const loaded = getLoadedSet();\n if (loaded.has(src) || hasScriptInDom(src)) {\n loaded.add(src);\n return Promise.resolve(false);\n }\n\n return new Promise((resolve, reject) => {\n try {\n const script = document.createElement(\"script\");\n script.type = \"module\";\n script.src = src;\n script.onload = () => {\n getLoadedSet().add(src);\n resolve(true);\n };\n script.onerror = (err) => {\n // Still mark as attempted to avoid tight retry loops\n getLoadedSet().add(src);\n reject(err);\n };\n document.head.appendChild(script);\n } catch (err) {\n reject(err);\n }\n });\n}\n\nasync function loadModuleScriptsFromElement(root) {\n if (!root || typeof root.querySelectorAll !== \"function\") {\n return [];\n }\n const scripts = Array.from(\n root.querySelectorAll('script[type=\"module\"][src]')\n );\n const uniqueSrcs = Array.from(\n new Set(scripts.map((s) => s.getAttribute(\"src\")).filter(Boolean))\n );\n return await Promise.all(uniqueSrcs.map((src) => ensureModuleScriptLoaded(src)));\n}\n\n/**\n * Find and insert module scripts from HTML fetched from SSR API.\n * @param {string} html HTML fetched from SSR API\n * @returns {Promise<void>} Promise that resolves when all module scripts are loaded\n */\nexport async function loadModuleScriptsFromHtml(html) {\n if (typeof html !== \"string\" || !html) {\n return [];\n }\n try {\n const doc = new DOMParser().parseFromString(html, \"text/html\");\n return await loadModuleScriptsFromElement(doc);\n } catch (_) {\n // Fallback: small regex to extract src attributes of module scripts (no closing tag match)\n const srcs = [];\n const re = /<script[^>]*type=[\"']module[\"'][^>]*src=[\"']([^\"']+)[\"'][^>]*>/gi;\n let m;\n while ((m = re.exec(html)) !== null) {\n if (m[1]) srcs.push(m[1]);\n }\n const uniqueSrcs = Array.from(new Set(srcs));\n return await Promise.all(uniqueSrcs.map((src) => ensureModuleScriptLoaded(src)));\n }\n}\n\n","// Shared SSR utilities for retailer integrations\n// - Safe cookie/localStorage helpers\n// - Session id management\n// - SSR headers builder (language, supplier token, auth/authless, session)\n// - Fetch SSR HTML with environment fallback\n// - DOM ready + element wait/retry helpers\n// - Optional v10 SDK configuration helper\n\nimport { env } from \"../../environments/environment.js\";\nimport { loadModuleScriptsFromHtml } from \"./ssr-scripts.js\";\n\n/************************************** SESSION ID UTIL **************************************/\n\nconst SESSION_STORAGE_KEY = \"_mealz/injector/session-id\";\n\n/**\n * Return the injector's session id, generating and persisting a uuid on first use.\n * @returns {string} Session ID\n */\nexport function getOrCreateSessionId() {\n let sessionId = sessionStorage.getItem(SESSION_STORAGE_KEY);\n if (sessionId) return sessionId;\n\n // crypto.randomUUID is only exposed in secure contexts; fall back on http/old browsers.\n const fallbackSessionId = `sid-${Date.now()}-${Math.random().toString(16).slice(2)}`;\n sessionId = crypto?.randomUUID?.() ?? fallbackSessionId;\n try {\n sessionStorage.setItem(SESSION_STORAGE_KEY, sessionId);\n } catch (_) {\n console.debug(\"[Mealz] sessionStorage setItem failed for sessionId\");\n }\n return sessionId;\n}\n\n/************************************** AUTHLESS ID UTIL **************************************/\n\nconst AUTHLESS_STORAGE_KEY = \"_mealz/injector/authless-id\";\n\nlet pendingAuthlessFetch = null;\n\nfunction clearStoredAuthlessId() {\n try {\n sessionStorage.removeItem(AUTHLESS_STORAGE_KEY);\n } catch (_) {\n console.debug(\"[Mealz] sessionStorage removeItem failed for authless-id\");\n }\n}\n\nasync function fetchAuthlessToken(supplierToken, baseUrl) {\n const resolvedBaseUrl = baseUrl ?? env?.ssr?.baseUrl;\n if (!resolvedBaseUrl) {\n throw new Error(\"[Mealz] baseUrl not configured\");\n }\n\n const url = `${resolvedBaseUrl}/v3/generate-authless-token`;\n const response = await fetch(url, {\n method: \"GET\",\n headers: { \"supplier-token\": supplierToken },\n });\n if (!response.ok) {\n throw new Error(`[Mealz] ${url} fetch failed: ${response.status} ${response.statusText}`);\n }\n\n const payload = await response.json();\n const authlessId = payload?.authless_id;\n if (!authlessId) {\n throw new Error(\"[Mealz] generate-authless-token response missing authless_id\");\n }\n return authlessId;\n}\n\nasync function getOrCreateAuthlessId(supplierToken, baseUrl) {\n const storedAuthlessId = sessionStorage.getItem(AUTHLESS_STORAGE_KEY);\n if (storedAuthlessId) {\n return storedAuthlessId;\n }\n\n if (pendingAuthlessFetch) {\n return pendingAuthlessFetch;\n }\n\n pendingAuthlessFetch = fetchAuthlessToken(supplierToken, baseUrl)\n .then((authlessId) => {\n try {\n sessionStorage.setItem(AUTHLESS_STORAGE_KEY, authlessId);\n } catch (_) {\n console.debug(\"[Mealz] sessionStorage setItem failed for authless-id\");\n }\n return authlessId;\n })\n .finally(() => {\n pendingAuthlessFetch = null;\n });\n\n return pendingAuthlessFetch;\n}\n// TODO: remove this function when we pass profiling via headers\nexport function getStoredAuthlessId() {\n return sessionStorage.getItem(AUTHLESS_STORAGE_KEY);\n}\n\n/************************************** SSR HTML FETCH UTILS **************************************/\n/**\n * Build headers for SSR requests.\n * @param {Object} params - Parameters for building headers\n * @param {string} params.language - Language ID\n * @param {string} params.supplierToken - Supplier token\n * @param {string} [params.userId] - Logged-in user ID; when omitted, a Mealz authless id is fetched and sent\n * @param {string} params.sessionId - Session ID\n * @param {Object} params.extraHeaders - Extra headers\n * @returns {Promise<Object>} Headers object\n */\nexport async function buildSsrHeaders({\n language,\n supplierToken,\n userId,\n sessionId,\n extraHeaders = {},\n baseUrl,\n}) {\n const headers = {\n \"language-id\": language,\n \"Supplier-token\": supplierToken,\n \"session-id\": sessionId,\n ...extraHeaders,\n };\n if (userId) {\n clearStoredAuthlessId();\n headers[\"authorization\"] = \"user_id \" + userId;\n } else {\n headers[\"authless-id\"] = await getOrCreateAuthlessId(supplierToken, baseUrl);\n }\n return headers;\n}\n\n/**\n * Fetch HTML from SSR API.\n * @param {string} endpoint - Endpoint to fetch\n * @param {Object} headers - Headers for the request\n * @param {Object} params - Parameters for the request\n * @returns {Promise<string>} HTML string\n */\nexport async function fetchSsrHtml(endpoint, headers, params = {}, baseUrl) {\n const resolvedBaseUrl = baseUrl ?? env?.ssr?.baseUrl;\n\n if (!resolvedBaseUrl) {\n throw new Error(\"[Mealz] baseUrl not configured\");\n }\n\n const search = new URLSearchParams();\n Object.entries(params).forEach(([k, v]) => {\n if (v !== undefined && v !== null && v !== \"\") search.append(k, String(v));\n });\n const url = `${resolvedBaseUrl}${endpoint}?${search.toString()}`;\n\n return fetch(url, { method: \"GET\", headers }).then(async (res) => {\n if (!res.ok) {\n throw new Error(`[Mealz] ${url} fetch failed: ${res.status} ${res.statusText}`);\n }\n\n const html = await res.text();\n await loadModuleScriptsFromHtml(html);\n return html;\n });\n}\n\n/************************************** SSR STYLES FETCH UTILS **************************************/\n\n/**\n * Insert <link rel=\"stylesheet\"> tags into document head for each href not already present.\n * @param {string[]} links - Absolute stylesheet URLs from the styles API\n */\nfunction applySsrStyleLinksToHead(links) {\n const head = document.head;\n if (!head) return;\n\n const existingHrefs = new Set(\n [...head.querySelectorAll('link[rel=\"stylesheet\"]')].map((el) => el.href)\n );\n\n for (const href of links) {\n if (!href || existingHrefs.has(href)) continue;\n\n const linkEl = document.createElement(\"link\");\n linkEl.rel = \"stylesheet\";\n linkEl.href = href;\n head.appendChild(linkEl);\n existingHrefs.add(href);\n }\n}\n\n/**\n * Fetch styles from SSR API (/styles/... JSON with links + optional html) and append link tags to the head.\n * @param {string} endpoint - Path including version, e.g. /v3/styles/catalog/catalog-home\n */\nexport async function fetchSsrStyles(endpoint, baseUrl) {\n const resolvedBaseUrl = baseUrl ?? env?.ssr?.baseUrl;\n\n if (!resolvedBaseUrl) {\n throw new Error(\"[Mealz] baseUrl not configured\");\n }\n\n const url = `${resolvedBaseUrl}${endpoint}`;\n const res = await fetch(url, { method: \"GET\" });\n if (!res.ok) {\n throw new Error(`[Mealz] ${url} fetch failed: ${res.status} ${res.statusText}`);\n }\n\n const payload = await res.json();\n const links = payload?.links;\n if (!Array.isArray(links)) {\n throw new TypeError('[Mealz] styles response missing links array');\n }\n\n applySsrStyleLinksToHead(links);\n}\n\n/**\n *************************************** DOM UTILS **************************************/\n\n/**\n * Wait for an element to be present in the DOM.\n * @param {string} selector - Selector to wait for\n * @param {Object} options - Options for the wait\n * @param {number} options.maxAttempts - Maximum number of attempts\n * @param {number} options.intervalMs - Interval between attempts\n * @returns {Promise<Element>} Element\n */\nexport function waitForElement(\n selector,\n { maxAttempts = 20, intervalMs = 250 } = {}\n) {\n return new Promise((resolve) => {\n let attempt = 0;\n const tryFind = () => {\n const el = document.querySelector(selector);\n if (el) return resolve(el);\n attempt += 1;\n if (attempt >= maxAttempts) return resolve(null);\n setTimeout(tryFind, intervalMs);\n };\n tryFind();\n });\n}\n\n/**\n * Execute a function when the DOM is ready.\n * @param {Function} fn Function to execute when the DOM is ready\n */\nexport function onReady(fn) {\n if (\n document.readyState === \"complete\" ||\n document.readyState === \"interactive\"\n ) {\n setTimeout(fn, 0);\n } else {\n document.addEventListener(\"DOMContentLoaded\", () => fn());\n }\n}\n\n/**\n * TODO: REMOVE WHEN MEALZ V10 IS REMOVED\n */\nexport function configureMealzV10IfPresent({\n token,\n language,\n hookCallback,\n storeId,\n userId,\n pushProductsToBasket\n}) {\n try {\n if (typeof window !== \"undefined\" && window.mealzV10) {\n if (token) window.mealzV10.supplier.setupWithToken(token);\n if (userId) window.mealzV10.user.loadWithExternalId(userId);\n if (language) window.mealzV10.user.setLanguage(language);\n if (hookCallback) window.mealzV10.hook.setHookCallback(hookCallback);\n if (storeId) window.mealzV10.pos.load(storeId);\n if (pushProductsToBasket) {\n window.mealzV10.basketSync.definePushProductsToCart(pushProductsToBasket);\n }\n window.mealzV10.basket.initialize();\n }\n } catch (_) {\n console.debug(\"[Mealz] configureMealzV10IfPresent failed\");\n }\n}","/** CoursesU Mealz backend env: plugin override, then host-based prod/uat. */\n\n// Ephemeral <html> attribute written by the Mealz Injector extension content script.\n// DOM-based (not storage) on purpose: it vanishes on reload/navigation and is never set\n// when the plugin is off, so disabling the plugin cleanly reverts to host-based resolution.\nexport const INJECTOR_ENV_ATTRIBUTE = \"data-mealz-injector-env\";\n\nconst SSR_BASE_URLS = {\n dev: \"http://localhost:3002\",\n uat: \"https://ssr-api-uat.mealz.ai\",\n prod: \"https://ssr-api.mealz.ai\",\n};\n\nconst SUPPLIER_TOKEN_BASE = {\n supplierId: 7,\n origin: \"coursesu\",\n noSupplier: false,\n orderHistory: true,\n};\n\nfunction readPluginEnvOverride() {\n const override = globalThis.document?.documentElement?.getAttribute?.(INJECTOR_ENV_ATTRIBUTE);\n if (override === \"dev\" || override === \"uat\" || override === \"prod\") {\n return override;\n }\n return undefined;\n}\n\nfunction resolveEnvFromHost() {\n try {\n return new URL(globalThis.location.href).hostname === \"www.coursesu.com\" ? \"prod\" : \"uat\";\n } catch {\n return \"uat\";\n }\n}\n\n/** @returns {'dev' | 'uat' | 'prod'} */\nexport function resolveCoursesUEnv() {\n return readPluginEnvOverride() ?? resolveEnvFromHost();\n}\n\nexport function getSsrBaseUrl() {\n return SSR_BASE_URLS[resolveCoursesUEnv()];\n}\n\nexport function getCoursesUSupplierToken() {\n const domain = resolveCoursesUEnv() === \"prod\" ? \"miam.coursesu.web\" : \"miam.test\";\n return btoa(JSON.stringify({ ...SUPPLIER_TOKEN_BASE, domain }));\n}\n","import { buildSsrHeaders, getOrCreateSessionId } from \"../../core/common/ssr-utils\";\nimport { getCoursesUSupplierToken, getSsrBaseUrl } from \"./coursesu-env.js\";\nimport { getAvailableStores } from \"./config-file\";\n\n\nfunction getCookie(name) {\n const cookieString =\n typeof document?.cookie === \"string\" ? document.cookie : \"\";\n if (!cookieString) return undefined;\n const parts = cookieString.split(\";\");\n for (const chunk of parts) {\n const part = chunk.trim();\n if (!part) continue;\n const eqIndex = part.indexOf(\"=\");\n if (eqIndex === -1) continue;\n const key = part.substring(0, eqIndex).trim();\n if (key === name) {\n const raw = part.substring(eqIndex + 1);\n return decodeURIComponent(raw);\n }\n }\n return undefined;\n}\n\nexport function getPosExtId() {\n return getCookie('storeId');\n}\n\n/** CoursesU TrustCommander: category \"1\" = function / profiling cookies. */\n// TODO: remove this function when we pass profiling via headers\nexport function isProfilingAllowed() {\n const privacyCenter = getCookie('TC_PRIVACY_CENTER');\n if (!privacyCenter) return false;\n return privacyCenter.split(',').includes('1');\n}\n\nexport async function buildCoursesUSSRHeaders(userId) {\n return buildSsrHeaders({\n language: \"fr\",\n supplierToken: getCoursesUSupplierToken(),\n userId: globalThis.loggedIn === true && userId != null ? String(userId) : undefined,\n sessionId: getOrCreateSessionId(),\n baseUrl: getSsrBaseUrl(),\n });\n}\n\nexport async function clearPreferences(userId) {\n localStorage.removeItem(\"_miam/preferences/guests\");\n localStorage.removeItem(\"_miam/preferences\");\n const loggedIn = globalThis.loggedIn === true;\n\n const baseUrl = getSsrBaseUrl();\n if (!baseUrl || userId == null || !loggedIn) {\n return;\n }\n\n try {\n await fetch(`${baseUrl}/v3/cache/remove`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ userId: String(userId), key: \"preferences\" }),\n });\n } catch (error) {\n console.debug(\"[Mealz Injector] Failed to clear SSR preferences cache\", error);\n }\n}\n\n/**\n * @returns true if host store add is part of AVAILABLE_SHELF\n * and screen minimun requirment is reach\n */\nexport async function isAvailable() {\n const stores = await getAvailableStores();\n return stores.includes(getPosExtId());\n}\n\n/**\n * Check {times} times every {delay} ms to see if {variableToCheck} has been defined.\n * @param {any} object the parent object of the variable to test\n * @param {string} property the name of the property of the object\n * @param {number} delay time in ms between each check\n * @param {number} times\n * @returns true if variableToCheck is different from undefined when it checks it or false if it is still undefined after {times} checks\n */\nexport function waitForVariable(object, property, delay, times, callback) {\n const interval = setInterval(() => {\n if (object[property] !== undefined || times == 0) {\n clearInterval(interval);\n callback(object[property]);\n } else {\n times --;\n }\n }, delay);\n}\n","import { handlePayment, handlePaymentStarted, listenToRetailerBasket, pushProductsToBasket, resetOnEmptyBasket } from \"./basket-sync\";\nimport { getAbCssUrl, getPlannerEntryAbVariants } from \"./config-file\";\nimport { getStoredAuthlessId } from \"../../core/common/ssr-utils\";\nimport { getPosExtId, isProfilingAllowed } from \"./utils\";\n\n\nconst MEALZ_LOG_LEVEL = 'none';\n// const MEALZ_LOG_LEVEL = 'all'; // Uncomment to activate logs\nconst AB_STORAGE_KEY = '_mealz/injector/ab';\nconst PLANNER_ENTRY_AB_STORAGE_KEY = '_mealz/injector/ab/planner-entry';\n\n\n/* **************************************** CALLBACKS **************************************** */\n\nfunction hookCallback(isLogged, isPosValid) {\n if (!isLogged) {\n document.querySelector(\"[data-login]\").click();\n return false\n }\n if (!isPosValid) {\n if (getPosExtId()?.length === 0) {\n document.querySelector(\".change-store-new\").click()\n }\n return false;\n }\n return true;\n}\n\n/**\n * Queries CoursesU API to change store, and reload page when response received\n */\nasync function forcePosCallback(posExtId) {\n const url = \"https://www.coursesu.com/on/demandware.store/Sites-DigitalU-Site/fr_FR/StoreLocator-SetStore?format=ajax\";\n const csrfToken = document.getElementsByName(\"csrf_token\")[0].value;\n const encodedCsrfToken = encodeURI(csrfToken);\n const fullUrl = `${url}&store_id=${posExtId}&csrf_token=${encodedCsrfToken}`;\n\n try {\n const response = await fetch(fullUrl, {\n credentials: \"include\",\n headers: {\n \"User-Agent\": \"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:124.0) Gecko/20100101 Firefox/124.0\",\n \"Accept\": \"*/*\",\n \"Accept-Language\": \"fr,fr-FR;q=0.8,en-US;q=0.5,en;q=0.3\",\n \"Content-Type\": \"application/json\",\n \"X-Requested-With\": \"XMLHttpRequest\",\n \"Sec-Fetch-Dest\": \"empty\",\n \"Sec-Fetch-Mode\": \"no-cors\",\n \"Sec-Fetch-Site\": \"same-origin\",\n \"Pragma\": \"no-cache\",\n \"Cache-Control\": \"no-cache\",\n },\n referrer: \"https://www.coursesu.com/recherche-tout-en-un\",\n method: \"GET\",\n mode: \"cors\",\n });\n\n if (response.ok) {\n globalThis.location.reload();\n } else {\n console.error(\"Failed to set store. Status:\", response.status);\n }\n } catch (error) {\n console.error(\"An error occurred while setting the store:\", error);\n }\n}\n\n\n/* **************************************** PROFILING CONSENT **************************************** */\n\n// TODO: remove this function when we pass profiling via headers\nfunction syncForbidProfiling() {\n const MEALZ = globalThis.mealz;\n const forbidProfiling = !isProfilingAllowed();\n\n if (globalThis.loggedIn === true && globalThis.tc_vars?.user_id) {\n MEALZ.user.updateForbidProfiling(forbidProfiling, globalThis.tc_vars.user_id, false);\n return;\n }\n\n const authlessId = getStoredAuthlessId();\n if (authlessId) {\n MEALZ.user.updateForbidProfiling(forbidProfiling, authlessId, true);\n }\n}\n\n\n/* **************************************** BASKET SYNC **************************************** */\n\nfunction initMealzBasketSync() {\n const MEALZ = globalThis.mealz;\n MEALZ.basketSync.definePushProductsToCart(pushProductsToBasket)\n handlePayment();\n listenToRetailerBasket();\n resetOnEmptyBasket();\n handlePaymentStarted();\n}\n\n\n/* **************************************** OPTIONALS **************************************** */\n\nfunction initMealzOptionals() {\n const MEALZ = globalThis.mealz;\n MEALZ.router.setRecipeCatalogUrl('/idees-repas.html'); // TODO: remove when V3 deprecate it\n MEALZ.router.setRetailerCartUrl('/panier'); // TODO: remove when V3 deprecate it\n}\n\n\n/* **************************************** A/B TESTING **************************************** */\n\nasync function initAbTesting() {\n const MEALZ = globalThis.mealz;\n // If an a/b testing campaign is on (defined in config file)\n const abConfig = await getAbCssUrl();\n if (abConfig) {\n console.debug('[Mealz Injector] A/B testing: config found', abConfig);\n // Define use as \"a\", \"b\", \"c\"... randomly\n // If user is already assigned a letter, let as is\n if (!localStorage.getItem(AB_STORAGE_KEY)) {\n const max = Object.keys(abConfig).length\n const rand = Math.floor(Math.random() * max);\n const version = Object.keys(abConfig)[rand];\n localStorage.setItem(AB_STORAGE_KEY, version);\n }\n\n // Configure analytics service to attach the letter to each event\n const abTestKey = localStorage.getItem(AB_STORAGE_KEY);\n console.debug('[Mealz Injector] A/B testing: User set to version', abTestKey);\n MEALZ.analytics.setAbTestKey(abTestKey);\n // Load the proper stylesheet using url in config file\n injectCss(abConfig[abTestKey]);\n\n // Otherwise, remove any previous a/b testing config kept in storage\n } else {\n console.debug('[Mealz Injector] A/B testing: no config found');\n localStorage.removeItem(AB_STORAGE_KEY);\n }\n\n const plannerEntryAbVariants = await getPlannerEntryAbVariants();\n const plannerEntryVariants = normalizeAbVariants(plannerEntryAbVariants);\n if (plannerEntryVariants.length === 0) {\n localStorage.removeItem(PLANNER_ENTRY_AB_STORAGE_KEY);\n return;\n }\n\n const currentVariant = localStorage.getItem(PLANNER_ENTRY_AB_STORAGE_KEY);\n if (currentVariant && plannerEntryVariants.includes(currentVariant)) {\n return;\n }\n\n const assignedVariant = plannerEntryVariants[Math.floor(Math.random() * plannerEntryVariants.length)];\n localStorage.setItem(PLANNER_ENTRY_AB_STORAGE_KEY, assignedVariant);\n}\n\nfunction normalizeAbVariants(variantsConfig) {\n if (Array.isArray(variantsConfig)) {\n return variantsConfig\n .map(variant => String(variant).trim())\n .filter(Boolean);\n }\n\n if (variantsConfig && typeof variantsConfig === 'object') {\n return Object.keys(variantsConfig)\n .map(variant => String(variant).trim())\n .filter(Boolean);\n }\n\n return [];\n}\n\nfunction injectCss(url) {\n // in config file, set \"a\": null to keep default version of stylesheet\n if (!url) {\n console.debug('[Mealz Injector] A/B testing: loading no css file');\n return;\n }\n\n console.debug('[Mealz Injector] A/B testing: loading css file', url);\n const head = document.head;\n const link = document.createElement(\"link\");\n\n link.type = \"text/css\";\n link.rel = \"stylesheet\";\n link.href = url;\n\n head.appendChild(link);\n}\n\n\n/* **************************************** INIT MEALZ **************************************** */\n\nexport async function initMealz() {\n const MEALZ = globalThis.mealz;\n MEALZ.config.mealzLogs(MEALZ_LOG_LEVEL)\n try {\n await initAbTesting();\n } catch (error) {\n console.warn(\n \"[Mealz Injector] A/B testing initialization failed, continuing without it:\",\n error\n );\n }\n MEALZ.hook.setHookCallback((isLogged, isPosValid) => hookCallback(isLogged, isPosValid));\n MEALZ.hook.setForcePosCallback((posExtId) => forcePosCallback(posExtId));\n syncForbidProfiling();\n initMealzBasketSync();\n initMealzOptionals();\n}\n","/** CoursesU catalog routes for supplier 7 (mealz-ssr-api routing.json). */\nexport const COURSESU_CATALOG_ROUTES = {\n home: {\n section: \"\",\n htmlEndpoint: \"/v3/catalog\",\n stylesEndpoint: \"/v3/styles/catalog/catalog-home\",\n },\n list: {\n section: \"liste\",\n htmlEndpoint: \"/v3/catalog/list\",\n stylesEndpoint: \"/v3/styles/catalog/catalog-list\",\n },\n category: {\n section: \"categorie\",\n htmlEndpoint: \"/v3/catalog/category\",\n stylesEndpoint: \"/v3/styles/catalog/catalog-category\",\n },\n mySpace: {\n section: \"mon-carnet\",\n htmlEndpoint: \"/v3/catalog/my-space\",\n stylesEndpoint: \"/v3/styles/catalog/my-space\",\n },\n};\n\n\n/** CoursesU category URLs use a retailer path; SSR expects the trailing Mealz package id. */\nfunction parseCoursesUCategoryId(categorie) {\n return categorie.match(/(?:^|\\/)(\\d+)\\/?$/)?.[1] ?? categorie;\n}\n\nexport function buildForwardedQueryParams() {\n const searchParams = new URLSearchParams(globalThis.location.search);\n const params = {};\n\n for (const [key, value] of searchParams.entries()) {\n if (key === \"section\") {\n continue;\n }\n params[key] = value;\n }\n\n if (params.categorie && !params.category_id) {\n params.category_id = parseCoursesUCategoryId(params.categorie);\n delete params.categorie;\n }\n\n return params;\n}\n\nexport function getCatalogSsrEndpoints() {\n const section = new URLSearchParams(globalThis.location.search).get(\"section\");\n\n return Object.values(COURSESU_CATALOG_ROUTES).find(\n ({ section: routeSection }) => routeSection === section,\n ) ?? COURSESU_CATALOG_ROUTES.home;\n}\n","import {\n fetchSsrHtml,\n fetchSsrStyles,\n waitForElement,\n} from \"../../core/common/ssr-utils.js\";\nimport {\n buildForwardedQueryParams,\n getCatalogSsrEndpoints\n} from \"./catalog-routing.js\";\nimport { getPosExtId } from \"./utils.js\";\nimport { getSsrBaseUrl } from \"./coursesu-env.js\";\n\n\nconst RECIPE_CATALOG_PLACEHOLDER = \"webc-miam-recipe-catalog\";\nconst MAX_RECIPES_PER_CATEGORY = 6;\nconst DISPLAY_RECIPE_VARIANT = 2;\nconst PLANNER_ENTRY_VARIANT = 1; // Variant 1 is current selection only\n\nexport async function injectCatalog(headers) {\n const target = await waitForElement(RECIPE_CATALOG_PLACEHOLDER, {\n maxAttempts: 20,\n intervalMs: 250,\n });\n if (!target) {\n console.warn(`[CoursesU] ${RECIPE_CATALOG_PLACEHOLDER} not found`);\n return;\n }\n\n try {\n const { htmlEndpoint, stylesEndpoint } = getCatalogSsrEndpoints();\n\n fetchSsrStyles(`${stylesEndpoint}?recipe_card_variant=${DISPLAY_RECIPE_VARIANT}`, getSsrBaseUrl());\n\n const html = await fetchSsrHtml(\n htmlEndpoint,\n headers,\n {\n max_recipes_per_category: MAX_RECIPES_PER_CATEGORY,\n recipe_card_variant: DISPLAY_RECIPE_VARIANT,\n planner_entry_variant: PLANNER_ENTRY_VARIANT,\n store_id: getPosExtId(),\n ...buildForwardedQueryParams(),\n },\n getSsrBaseUrl()\n );\n\n target.insertAdjacentHTML(\"afterend\", html);\n target.remove();\n } catch (err) {\n console.error(\"[CoursesU] catalog SSR injection failed\", err);\n }\n}\n\nexport function listenHeaderHeightChange() {\n const headerElement = document.querySelector('[data-header]');\n if (!headerElement) {\n return;\n }\n\n const observer = new MutationObserver(() => {\n\n const bottom = headerElement.getBoundingClientRect().bottom;\n if (bottom >= 0) {\n globalThis.mealz.setStickyHeaderHeight(bottom);\n }\n // if bottom < 0 it means U's header is in an animation, so we need to wait for the animation to finish\n else {\n globalThis.mealz.setStickyHeaderHeight(0);\n waitForStickyHeaderAnimation()\n }\n });\n\n observer.observe(\n headerElement.parentElement,\n { attributes: true, childList: true, subtree: true }\n );\n}\n\n/**\n * Wait 50 * 15 = 700ms for the header animation to finish\n */\nfunction waitForStickyHeaderAnimation(timesLeft = 50) {\n const headerElement = document.querySelector('[data-header]');\n if (timesLeft > 0 && headerElement) {\n setTimeout(() => {\n const bottom = headerElement.getBoundingClientRect().bottom;\n globalThis.mealz.setStickyHeaderHeight(Math.max(bottom, 0));\n waitForStickyHeaderAnimation(timesLeft - 1);\n }, 15)\n }\n}\n","import { fetchSsrHtml, fetchSsrStyles, waitForElement } from \"../../core/common/ssr-utils.js\";\nimport { getPosExtId } from \"./utils.js\";\nimport { getSsrBaseUrl } from \"./coursesu-env.js\";\n\nconst MEALS_PLANNER_PLACEHOLDER = \"webc-miam-meals-planner\";\nconst PLANNER_HTML_ENDPOINT = \"/v3/planner\";\nconst PLANNER_STYLES_ENDPOINT = \"/v3/styles/planner\";\n\nexport async function injectPlanner(headers) {\n const target = await waitForElement(MEALS_PLANNER_PLACEHOLDER, {\n maxAttempts: 20,\n intervalMs: 250,\n });\n if (!target) {\n console.warn(`[Mealz] ${MEALS_PLANNER_PLACEHOLDER} not found`);\n return;\n }\n\n try {\n fetchSsrStyles(PLANNER_STYLES_ENDPOINT, getSsrBaseUrl());\n const html = await fetchSsrHtml(PLANNER_HTML_ENDPOINT, headers, { store_id: getPosExtId() }, getSsrBaseUrl());\n target.insertAdjacentHTML(\"afterend\", html);\n target.remove();\n } catch (err) {\n console.error(\"[Mealz] planner SSR injection failed\", err);\n }\n}\n","/**\n * The recipe recap button is a link to the very old version of the History page in My Space, which can be seen only on CoursesU\n * They currently want us to maintain it only because we don't have an url pointing to the history directly and apparently CoursesU links\n * to the recap page when sending confirmation mails for orders which contain recipes\n * Until they can't link to the new order history they want us to maintain the recap page\n */\n\n/** *************************************** RECIPE RECAP BUTTON **************************************** */\n\n\nexport function initRecipeRecapButton() {\n const template = document.createRange().createContextualFragment(\n `\n <li id=\"mealzMesRepas\" class=\"account-dropdown-new-list-item\">\n <a class=\"account-link\">\n <div class=\"account-dropdown-text\">\n <span class=\"account-link-text\"> Mes repas </span>\n <span id=\"mealzRecipeCounter\" class=\"mealz-recipe-counter\"></span>\n </div>\n </a>\n </li>\n `\n );\n\n template.firstElementChild.addEventListener(\"click\", () => location.href = \"/mes-repas.html\");\n const itemSection = document.getElementsByClassName('account-dropdown-new-list')[0];\n const toInjectBefore = itemSection?.getElementsByClassName('account-dropdown-new-list-item')[1];\n toInjectBefore.parentNode.insertBefore(template, toInjectBefore);\n const counter = document.getElementById('mealzRecipeCounter');\n initRecipeCounter(counter);\n}\n\n\nfunction initRecipeCounter(counter) {\n const recipesCount = globalThis.mealz.basket.recipeCount()?.value;\n if (recipesCount == 0) counter.classList.add('mealz-hidden');\n counter.innerHTML = recipesCount;\n globalThis.mealz.basket.recipeCount().subscribe((recipesCount) => {\n counter.innerHTML = recipesCount;\n recipesCount == 0 ? counter.classList.add('mealz-hidden') : counter.classList.remove('mealz-hidden')\n });\n}\n\n\n/** *************************************** RECIPE RECAP PAGE **************************************** */\n\n\n/**\n * This is a link to the very version of old order-history, which can be seen only on CoursesU\n * They currently want us to maintain it only because we don't have an url pointing to the order-history directly and apparently CoursesU links\n * to the recap page when sending confirmation mails for orders which contain recipes\n * Until they can't link to the new order history they want us to maintain the recap page\n */\n\nconst PAGE_TEMPLATE = document.createRange().createContextualFragment(`\n <div class='mealz-recap-page-header'>\n <div class='mealz-recap-page-header__breadcrumbs'>\n <div class=\"mealz-recap-page-header__breadcrumbs__home\" href='${globalThis.location.origin}'></div>\n <div class=\"mealz-recap-page-header__breadcrumbs__caret\"></div>\n <a href='${globalThis.location.origin}/mon-compte'> Mon compte </a>\n <div class=\"mealz-recap-page-header__breadcrumbs__caret\"></div>\n <a> Mes repas </a>\n </div>\n <div class='mealz-recap-page-header__title'>\n <span>Mes repas (<span id=\"mealzMesRepasRecipeCounter\" class=\"mealz-recipe-counter\"></span>)\n </div>\n <div class='mealz-recap-page-header__subtitle'>\n Les ingrédients pour ces recettes sont actuellement dans votre panier.\n Retrouvez ici le détail des recettes pour les réaliser chez vous.\n </div>\n </div>\n <div class=\"mealz-recap-page__main__container\">\n <div class=\"mealz-recipes-page__header\">\n <div id=\"catalogButton\" class=\"mealz-recipes-page__tab\">\n Recettes\n </div>\n <div id=\"recipeRecapButton\" class=\"mealz-recipes-page__tab mealz-recipes-page__tab__curent\">\n Mes repas\n </div>\n </div>\n <div class=\"mealz-recap-page__sub__container\">\n <div class=\"mealz-recap-page__sub__container__left\">\n <div class=\"mealz-recap-page__left__header \">\n <h1 id='recapPageLeftHeader'>\n </h1>\n </div>\n <div class=\"mealz-recap-page__left__recipe__block\">\n <p id=\"previewBlockHeader\" class=\"mealz-recap-page__recipe__block__header\">\n Vous avez sélectionné <span id=\"nbOfMeals\"></span> repas. <br />\n On y jette un dernier petit coup d'oeil ?\n </p>\n <!-- TODO: fetch preview block from API -->\n <webc-miam-basket-preview-block></webc-miam-basket-preview-block>\n </div>\n <div class=\"mealz-recap-page__left__button__raw\">\n <div class=\"mealz-recap-page__raw__continue__button\">\n <span id=\"continueButton\">\n Continuer mes achats\n </span>\n </div>\n <button class=\"mealz-recap-page__raw__remove__all__button\">\n <span id=\"removeAllButton\">\n Retirer tous les repas\n </span>\n </button>\n </div>\n </div>\n <div class=\"mealz-recap-page__sub__container__right\">\n <div class=\"mealz-recap-page__right__card\">\n <h3 class=\"mealz-recap-page__right__card__header\">\n Récapitulatif des repas\n </h3>\n <hr class=\"mealz-recap-page__right__card__divider\">\n <p id=\"rightCardStats\" class=\"mealz-recap-page__right__card__stats\">\n </p>\n <div class=\"mealz-recap__card__comfirm_raw\">\n <button id=\"confirmOrderButton\">\n <span id=\"confirmOrderText\">OK, voir mon panier</span>\n </button>\n </div>\n <!-- <p id=\"rightCardFooter\" class=\"mealz-recap__right__card__footer\"></p> -->\n </div>\n </div>\n </div>\n `);\n\nlet recapLastNumberOfRecipes = 0\n\nexport function initRecapPage(){\n injectPageFragment();\n globalThis.mealz.basket.recipeCount().subscribe((recipeCount) => updateRecapPage(recipeCount));\n const mutationTarget = document.getElementsByClassName('mealz-recap-page__left__recipe__block')[0];\n const observedAtts = { attributes: false, childList: true, subtree: true };\n const listMutationObserver = new MutationObserver(openDisplayOnClickInRecap);\n listMutationObserver.observe(mutationTarget, observedAtts);\n const counter = document.getElementById('mealzMesRepasRecipeCounter');\n initRecipeCounter(counter);\n}\n\nfunction injectPageFragment() {\n const pagePlaceholder = document.getElementById(\"primary\");\n if (!pagePlaceholder) return;\n updateRecapPage(globalThis.mealz.basket.recipeCount()?.value);\n initButtonListeners();\n pagePlaceholder.replaceWith(PAGE_TEMPLATE);\n}\n\nfunction initButtonListeners() {\n const confirmOrderButton = PAGE_TEMPLATE.getElementById(\"confirmOrderButton\");\n const continueButton = PAGE_TEMPLATE.getElementById(\"continueButton\");\n const removeAllButton = PAGE_TEMPLATE.getElementById(\"removeAllButton\");\n confirmOrderButton.addEventListener(\"click\", () => location.href = '/panier', false);\n continueButton.addEventListener(\"click\", () => location.href = '/', false);\n removeAllButton.addEventListener(\"click\", () => globalThis.mealz.basket.reset(), false);\n}\n\nfunction openDisplayOnClickInRecap() {\n const items = Array.from(\n document\n .getElementsByClassName('mealz-recap-page__left__recipe__block')[0]\n .getElementsByClassName('mealz-basket-preview-line clickable')\n );\n if (recapLastNumberOfRecipes < items.length) {\n items.forEach(item => \n item.addEventListener('click', () => globalThis.mealz.recipes.openDetails(item.id))\n );\n }\n recapLastNumberOfRecipes = items.length;\n}\n\n/**\n * Call each time recipeCount changed and on load\n * @param {recipesCount, entriesCount, totalPrice } recipeCount\n */\nfunction updateRecapPage(recipeCount) {\n const page = document.getElementsByClassName('mealz-recap-page__main__container')[0];\n if (!page) return;\n const previewBlockHeader = page.getElementById(\"previewBlockHeader\");\n const leftHeader = page.getElementById(\"recapPageLeftHeader\");\n const rightCardStats = page.getElementById(\"rightCardStats\");\n const removeAllButton = page.getElementById(\"removeAllButton\");\n\n if (recipeCount > 0) {\n const nbOfMeals = page.getElementById(\"nbOfMeals\");\n previewBlockHeader.classList.remove(\"mealz-hidden\");\n removeAllButton.classList.remove(\"mealz-hidden\");\n leftHeader.innerHTML = \"Avant de passer au panier...\";\n nbOfMeals.innerHTML = recipeCount;\n rightCardStats.innerHTML = `${recipeCount} repas`;\n } else {\n previewBlockHeader.classList.add(\"mealz-hidden\");\n removeAllButton.classList.add(\"mealz-hidden\");\n leftHeader.innerHTML = \"Mes repas\";\n rightCardStats.innerHTML = `0 repas, 0 produits`;\n }\n}\n","import { fetchSsrStyles, waitForElement } from \"../../core/common/ssr-utils.js\";\nimport { loadModuleScriptsFromHtml } from \"../../core/common/ssr-scripts.js\";\nimport { getSsrBaseUrl } from \"./coursesu-env.js\";\nimport { getPosExtId, isAvailable } from \"./utils\";\n\n\nconst DISPLAY_RECIPE_VARIANT = 2;\nconst RECIPE_CARD_MULTIPLE_HTML_ENDPOINT = \"/v3/recipe-card/multiple\";\nconst RECIPE_CARD_MULTIPLE_STYLES_ENDPOINT =\n `/v3/styles/recipe-card/multiple?recipe_card_variant=${DISPLAY_RECIPE_VARIANT}`;\n\nlet productsAndCardPositions = [];\nlet ssrCardsById = null;\nconst hiddenPositions = new Set(); // Track positions that should stay hidden\nlet injectTimeout = null; // Add debouncing for injection\nlet removeTimeout = null; // Add debouncing for removal\n\nexport async function initShelvesCardInjection() {\n // Injects recipes on shelves\n if(await isAvailable()){\n productsAndCardPositions = cardsPositionsByScreenWidth();\n injectCards();\n const pageListenerInject = new MutationObserver(() => {\n // Debounce injection to prevent excessive calls\n clearTimeout(injectTimeout);\n injectTimeout = setTimeout(() => injectCards(), 100);\n });\n pageListenerInject.observe(document.body, { attributes: false, childList: true, subtree: true });\n const pageListenerRemove = new MutationObserver(() => {\n // Debounce removal to prevent excessive calls\n clearTimeout(removeTimeout);\n removeTimeout = setTimeout(() => removeCardsIfNecessary(), 100);\n });\n pageListenerRemove.observe(document.body, { attributes: false, childList: true, subtree: true });\n }\n}\n\n/* ******************************************************* SSR PREFETCH ******************************************************** */\n\n/**\n * Prefetch recipe-cards from the ids of the preceding and following products\n * Does not inject the cards into the DOM, but stores them in the `ssrCardsById` object\n * This allows for the scripts to be loaded before the cards are injected into the DOM, avoiding FOUC\n * or problems of window.mealz being undefined for the main.js script execution.\n */\nexport async function prefetchRecipeCards(headers) {\n if (!(await isAvailable())) {\n return;\n }\n\n const container = await waitForElement(\".tiles-container\", {\n maxAttempts: 20,\n intervalMs: 250,\n });\n if (!container) {\n console.warn(\"[Mealz] .tiles-container not found for recipe cards\");\n return;\n }\n\n try {\n fetchSsrStyles(RECIPE_CARD_MULTIPLE_STYLES_ENDPOINT, getSsrBaseUrl());\n\n const contexts = buildRecipeCardContexts(container.children);\n if (contexts.length === 0) {\n return;\n }\n\n const data = await fetchRecipeCardMultiple(headers, contexts);\n await Promise.all(data.map(({ html }) => loadModuleScriptsFromHtml(html)));\n\n ssrCardsById = Object.fromEntries(\n data.map(({ position, html }) => [Number(position), html])\n );\n } catch (err) {\n console.warn(\"[Mealz] recipe cards SSR prefetch failed\", err);\n }\n}\n\nfunction fetchRecipeCardMultiple(headers, contexts) {\n const baseUrl = getSsrBaseUrl();\n if (!baseUrl) {\n throw new Error(\"[Mealz] baseUrl not configured\");\n }\n\n const search = new URLSearchParams({\n variant: String(DISPLAY_RECIPE_VARIANT),\n store_id: getPosExtId(),\n });\n const url = `${baseUrl}${RECIPE_CARD_MULTIPLE_HTML_ENDPOINT}?${search.toString()}`;\n\n return fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...headers,\n },\n body: JSON.stringify({ contexts }),\n }).then(async (res) => {\n if (!res.ok) {\n throw new Error(`[Mealz] ${url} fetch failed: ${res.status} ${res.statusText}`);\n }\n\n const payload = await res.json();\n return payload?.data ?? [];\n });\n}\n\nfunction buildRecipeCardContexts(listChildren) {\n const products = getProductsInList(listChildren);\n const contexts = [];\n\n cardsPositionsByScreenWidth().forEach((position) => {\n const precedingProduct = products[position.positionOfPrecedingProduct];\n const followingProduct = products[position.positionOfPrecedingProduct + 1];\n if (!precedingProduct || !followingProduct) {\n return;\n }\n\n const productIds = getProductsIds([precedingProduct, followingProduct]);\n if (productIds.length === 0 || productIds[0] === \"\") {\n return;\n }\n\n contexts.push({\n position: position.cardPosition,\n productIds,\n });\n });\n\n return contexts;\n}\n\n/* ******************************************************* CARD POSITIONS ******************************************************** */\n\n/**\n * @returns An array of couples of the *final* positions of the cards and the *initial* position of their preceding product\n */\nfunction cardsPositionsByScreenWidth() {\n const productsPosition = [3, 9, 21, 28];\n\n // cards should be injected after products at initial position p, which makes them be in the final position p + i + 1;\n return productsPosition.map((p, i) => ({\n positionOfPrecedingProduct: p,\n cardPosition: p + i + 1,\n }));\n}\n\n/* ******************************************************* CARD INJECTION AND REMOVAL ******************************************************** */\n\nasync function removeCardsIfNecessary() {\n if (!(await isAvailable())) {\n document.querySelectorAll(\".miamRecipeCardContainer\").forEach((card) => card.remove());\n }\n}\n\n/**\n * If we can find the product list, try to inject a card for each position\n */\nasync function injectCards() {\n if (await isAvailable()) {\n const cardMainContainer = getCardMainContainer();\n if (cardMainContainer && cardMainContainer.children) {\n productsAndCardPositions.forEach((position) => {\n injectCardIfNecessary(position);\n });\n }\n }\n}\n\n/**\n * If the element at position is not a recipe-card, try to add a card at the position or move the card that should be at position\n */\nfunction injectCardIfNecessary(position) {\n // Skip injection if this position is marked as hidden\n if (hiddenPositions.has(position.cardPosition)) {\n return;\n }\n\n const list = getCardMainContainer();\n const products = getProductsAndCardsInList(list.children);\n const productAtPosition = products[position.cardPosition];\n \n // Check if there's already a card at the correct position\n if (productAtPosition && +productAtPosition.dataset.intendedPosition === position.cardPosition) {\n return; // Card is already correctly positioned\n }\n \n if (\n productAtPosition &&\n +productAtPosition.dataset.intendedPosition !== position.cardPosition\n ) {\n insertCardAfterProduct(position);\n }\n}\n\n/**\n * If the card for the position is on the page, move it at the position\n * Else, try to add a new card at position\n */\nfunction insertCardAfterProduct(position) {\n const list = getCardMainContainer();\n const products = getProductsInList(list.children);\n const precedingProduct = products[position.positionOfPrecedingProduct];\n const followingProduct = products[position.positionOfPrecedingProduct + 1];\n if (precedingProduct && followingProduct) {\n // Try to get the card if already in the DOM\n let cardContainer = searchExistingCardForPosition(position);\n if (!cardContainer) {\n // Try to create card\n const productsIds = getProductsIds([precedingProduct, followingProduct]);\n if (productsIds.length !== 0 && productsIds[0] !== \"\") {\n cardContainer = createCard(productsIds, position.cardPosition);\n if (cardContainer) {\n // Add a dataset value to keep track of where the card should be and compare with where it actually is\n cardContainer.dataset.intendedPosition = position.cardPosition;\n }\n }\n }\n if (cardContainer) {\n precedingProduct.after(cardContainer);\n }\n }\n}\n\nfunction searchExistingCardForPosition(position) {\n return document.querySelector(`[data-intended-position=\"${position.cardPosition}\"]`);\n}\n\n/* ******************************************************* CARD CONTAINER CREATION ******************************************************** */\n\n/**\n * Create the card and the container around it\n */\nfunction createCard(productsIds, position) {\n const html = ssrCardsById?.[position];\n if (!html) {\n return null;\n }\n\n const cardContainer = document.createElement(\"li\");\n cardContainer.classList.add(\"grid-tile\", \"small-6\", \"medium-6\");\n cardContainer.innerHTML = html;\n return cardContainer;\n}\n\n/* ******************************************************* UTILS ******************************************************** */\n\n/**\n * Find the product list\n */\nfunction getCardMainContainer() {\n return document.getElementsByClassName(\"tiles-container\")[0];\n}\n\nfunction getProductsInList(list) {\n return Array.from(list).filter((x) => !!x.dataset.tcProductTile);\n}\n\nfunction getProductsAndCardsInList(list) {\n return Array.from(list).filter((x) => !!x.dataset.tcProductTile || !!x.dataset.intendedPosition);\n}\n\nfunction getProductsIds(products) {\n return products.map((product) => product.querySelector(\"[data-product-tile]\")?.dataset.itemid || \"\");\n}\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n","import { fetchSsrStyles, waitForElement } from \"../../core/common/ssr-utils.js\";\nimport { loadModuleScriptsFromHtml } from \"../../core/common/ssr-scripts.js\";\nimport { getSsrBaseUrl } from \"./coursesu-env.js\";\nimport { getPosExtId } from \"./utils.js\";\n\nconst RECIPE_TAGS_ENDPOINT = \"/v3/recipe-tags\";\nconst RECIPE_TAG_STYLES_ENDPOINT = \"/v3/styles/recipe-tag\";\n\nlet ssrTagsByProductId = null;\n\nlet currentlyInjecting = false;\nlet newInjectionToProcess = false;\n\nfunction isBasketPage() {\n return globalThis.location.href.includes(\"/panier\");\n}\n\n/* ******************************************************* SSR PREFETCH ******************************************************** */\n\n/**\n * Prefetch recipe-tags from cart product ext IDs.\n * Does not inject into the DOM; stores HTML in `ssrTagsByProductId`.\n */\nexport async function prefetchRecipeTags(headers) {\n if (!isBasketPage()) {\n return;\n }\n\n const storeId = getPosExtId();\n if (!storeId) {\n return;\n }\n\n const container = await waitForElement(\".cart-content-left-wrapper\", {\n maxAttempts: 20,\n intervalMs: 250,\n });\n if (!container) {\n console.warn(\"[CoursesU] .cart-content-left-wrapper not found for recipe tags\");\n return;\n }\n\n const productIds = collectProductIds();\n if (productIds.length === 0) {\n ssrTagsByProductId = {};\n return;\n }\n\n try {\n fetchSsrStyles(RECIPE_TAG_STYLES_ENDPOINT, getSsrBaseUrl());\n\n const data = await fetchRecipeTagsMultiple(headers, productIds);\n await Promise.all(data.map(({ html }) => loadModuleScriptsFromHtml(html)));\n\n ssrTagsByProductId = Object.fromEntries(\n data.map(({ productId, html }) => [productId, html])\n );\n } catch (err) {\n console.warn(\"[CoursesU] recipe tags SSR prefetch failed\", err);\n }\n}\n\nfunction fetchRecipeTagsMultiple(headers, productIds) {\n const baseUrl = getSsrBaseUrl();\n if (!baseUrl) {\n throw new Error(\"[Mealz] baseUrl not configured\");\n }\n\n const search = new URLSearchParams({\n store_id: getPosExtId(),\n product_ids: JSON.stringify(productIds),\n });\n const url = `${baseUrl}${RECIPE_TAGS_ENDPOINT}?${search.toString()}`;\n\n return fetch(url, {\n method: \"GET\",\n headers,\n }).then(async (res) => {\n if (!res.ok) {\n throw new Error(`[Mealz] ${url} fetch failed: ${res.status} ${res.statusText}`);\n }\n\n const payload = await res.json();\n return payload?.data ?? [];\n });\n}\n\nfunction collectProductIds() {\n const cartRows = document.getElementsByClassName(\"cart-row\");\n const ids = [...cartRows]\n .map((row) => row.dataset.itemid)\n .filter(Boolean);\n return [...new Set(ids)];\n}\n\n/* ******************************************************* TAG INJECTION ******************************************************** */\n\n/**\n * Inject the recipe-tags on the basket page of CoursesU. The feature is old and we do not maintain it much,\n * but CoursesU wants us to maintain it\n */\nexport function initBasketTagInjection() {\n if (!isBasketPage()) {\n return;\n }\n\n const mutationTarget = document.getElementsByClassName(\"cart-content-left-wrapper\")[0];\n if (!mutationTarget) {\n return;\n }\n\n const observedAtts = { attributes: false, childList: true, subtree: true };\n const basketObserver = new MutationObserver(() => {\n if (currentlyInjecting) {\n newInjectionToProcess = true;\n } else {\n injectRecipesTags();\n }\n });\n basketObserver.observe(mutationTarget, observedAtts);\n\n injectRecipesTags();\n}\n\nfunction injectRecipesTags() {\n newInjectionToProcess = false;\n currentlyInjecting = true;\n\n try {\n applyTagsFromCache();\n } catch (err) {\n console.warn(\"[CoursesU] recipe-tags injection failed\", err);\n } finally {\n currentlyInjecting = false;\n if (newInjectionToProcess) {\n injectRecipesTags();\n }\n }\n}\n\nfunction applyTagsFromCache() {\n if (!ssrTagsByProductId) {\n return;\n }\n\n ensureTagContainers();\n\n const cartRows = document.getElementsByClassName(\"cart-row\");\n [...cartRows].forEach((row) => {\n const extId = row.dataset.itemid;\n const container = row.querySelector(\".mealz-recipe-tag-container\");\n if (!container || !extId) {\n return;\n }\n if (container.querySelector(\"mealz-recipe-tag\")) {\n return;\n }\n container.innerHTML = ssrTagsByProductId[extId] ?? \"\";\n });\n}\n\nfunction ensureTagContainers() {\n const cartRows = document.getElementsByClassName(\"cart-row\");\n [...cartRows].forEach((row) => {\n if (row.querySelector(\".mealz-recipe-tag-container\")) {\n return;\n }\n const tagContainer = document.createRange().createContextualFragment(\n `<div class=\"mealz-recipe-tag-container\"></div>`\n );\n row.appendChild(tagContainer);\n });\n}\n","import { fetchSsrHtml, fetchSsrStyles, waitForElement } from \"../../core/common/ssr-utils.js\";\nimport { getPosExtId } from \"./utils.js\";\nimport { getSsrBaseUrl } from \"./coursesu-env.js\";\n\n/**\n * CoursesU have their own recipe catalog which has nothing to do with ours (and which they released in the same version as they released ours)\n * We currently maintain order-buttons on the recipes of their catalog, which are recipe-card-ctas that are put directly in their recipes.\n *\n * Their catalog only exposes a recipe title (no Mealz recipe id / ext-id), so the CTA is fetched from the SSR API\n * by name: the server resolves the title to a recipe id and renders nothing when there is no exact match.\n *\n * SSR HTML is prefetched in fetchFeaturesHTML (before globalThis.mealz is waited on) so module scripts load early;\n * DOM injection runs later from the cache, once initMealz has completed.\n */\n\nconst RECIPE_CARD_CTA_HTML_ENDPOINT = '/v3/recipe-card-cta';\nconst RECIPE_CARD_CTA_STYLES_ENDPOINT = '/v3/styles/recipe-card/recipe-card-cta';\n\nconst seenCoursesURecipes = [];\nconst htmlByRecipeName = new Map();\nconst fetchInFlight = new Map();\n\nlet lastHeaders = null;\nlet stylesLoaded = false;\nlet injectTimeout = null;\nlet observerStarted = false;\n\nconst parsers = [\n // CoursesU recipe catalog\n {\n href: /\\/mieux-consommer\\//,\n waitSelector: '.recipe-tile',\n findRecipes: () => {\n return Array.from(document.getElementsByClassName('recipe-tile')).map(element => {\n return {\n name: element.querySelector('h2.recipe-name').textContent.trim(),\n parentElement: element.getElementsByClassName('recipe-details')[0]\n };\n });\n }\n },\n // CoursesU recipe details\n {\n href: /\\/Recette_[^/]+\\.html/,\n waitSelector: '.recipe-main-header',\n findRecipes: () => {\n return [{\n name: document.getElementsByClassName('recipe-main-header')[0].children[0].textContent.trim(),\n parentElement: document.querySelector('div.entry--key-information')\n }];\n }\n }\n];\n\nexport function isOrderButtonsPage() {\n return parsers.some(p => globalThis.location.href.match(p.href));\n}\n\nfunction getParser() {\n return parsers.find(p => globalThis.location.href.match(p.href));\n}\n\nasync function waitForRecipeElements() {\n const parser = getParser();\n if (!parser?.waitSelector) {\n return;\n }\n await waitForElement(parser.waitSelector, { maxAttempts: 20, intervalMs: 250 });\n}\n\nfunction findRecipesOnPage() {\n const parser = getParser();\n return parser ? parser.findRecipes().filter(recipe => recipe.name && recipe.parentElement) : [];\n}\n\nfunction ensureStylesLoaded() {\n if (stylesLoaded) {\n return;\n }\n stylesLoaded = true;\n fetchSsrStyles(RECIPE_CARD_CTA_STYLES_ENDPOINT, getSsrBaseUrl());\n}\n\nasync function fetchButtonHtml(headers, recipeName) {\n if (htmlByRecipeName.has(recipeName)) {\n return htmlByRecipeName.get(recipeName);\n }\n if (fetchInFlight.has(recipeName)) {\n return fetchInFlight.get(recipeName);\n }\n\n const promise = fetchSsrHtml(RECIPE_CARD_CTA_HTML_ENDPOINT, headers, {\n recipe_name: recipeName,\n store_id: getPosExtId(),\n }, getSsrBaseUrl())\n .then((html) => {\n htmlByRecipeName.set(recipeName, html);\n fetchInFlight.delete(recipeName);\n return html;\n })\n .catch((err) => {\n fetchInFlight.delete(recipeName);\n throw err;\n });\n\n fetchInFlight.set(recipeName, promise);\n return promise;\n}\n\nexport async function prefetchOrderButtons(headers) {\n lastHeaders = headers;\n ensureStylesLoaded();\n await waitForRecipeElements();\n\n const recipes = findRecipesOnPage();\n const recipeNames = [...new Set(recipes.map(recipe => recipe.name))];\n\n await Promise.all(\n recipeNames.map(async (recipeName) => {\n try {\n await fetchButtonHtml(headers, recipeName);\n } catch (err) {\n console.warn(\n `[CoursesU] order-button SSR prefetch failed for recipe \"${recipeName}\"`,\n err\n );\n }\n })\n );\n}\n\nfunction ensureObserver() {\n if (observerStarted) {\n return;\n }\n observerStarted = true;\n\n new MutationObserver(() => {\n clearTimeout(injectTimeout);\n injectTimeout = setTimeout(() => checkForCoursesURecipes(), 100);\n }).observe(document.body, { attributes: false, childList: true, subtree: true });\n}\n\n/**\n * Inject prefetched order buttons into the DOM.\n */\nexport function injectOrderButtons() {\n ensureObserver();\n checkForCoursesURecipes();\n}\n\nfunction checkForCoursesURecipes() {\n const recipes = findRecipesOnPage();\n recipes.forEach(recipe => {\n // Ignore recipes that already got seen\n if (seenCoursesURecipes.includes(recipe.parentElement)) {\n return;\n }\n seenCoursesURecipes.push(recipe.parentElement);\n\n if (recipe.name) {\n injectButton(recipe, recipe.name);\n }\n });\n}\n\nasync function injectButton(recipe, recipeName) {\n try {\n let html = htmlByRecipeName.get(recipeName);\n\n // Recipes discovered after prefetch (e.g. infinite scroll) are fetched on demand\n if (html === undefined && lastHeaders) {\n html = await fetchButtonHtml(lastHeaders, recipeName);\n }\n\n if (!html?.trim()) {\n return;\n }\n\n const container = document.createElement(\"div\");\n container.classList.add(\"mealz-button-parent-card-container\");\n container.insertAdjacentHTML(\"beforeend\", html);\n recipe.parentElement.appendChild(container);\n } catch (err) {\n console.warn(\n `[CoursesU] order-button SSR injection failed for recipe \"${recipeName}\"`,\n err\n );\n }\n}\n","import { fetchSsrHtml, fetchSsrStyles } from \"../../core/common/ssr-utils.js\";\nimport { getPosExtId } from \"./utils.js\";\nimport { getSsrBaseUrl } from \"./coursesu-env.js\";\n\nconst PENDING_ATTR = \"data-mealz-ssr-pending\";\nconst RECIPE_CARD_HTML_ENDPOINT = \"/v3/recipe-card\";\nconst RECIPE_CARD_STYLES_ENDPOINT = \"/v3/styles/recipe-card\";\nconst DISPLAY_RECIPE_VARIANT = 2;\n\nlet stylesLoaded = false;\nlet observerStarted = false;\nlet injectTimeout = null;\nlet lastHeaders = null;\n\nconst htmlByRecipeId = new Map();\nconst fetchInFlight = new Map();\n\nfunction getRecipeId(el) {\n return el.getAttribute(\"recipe-id\") || el.recipeId || \"\";\n}\n\nfunction collectPendingCards() {\n return [\n ...document.querySelectorAll(\n `webc-miam-recipe-card[recipe-id]:not([${PENDING_ATTR}])`\n ),\n ];\n}\n\nfunction markPending(el, recipeId) {\n el.setAttribute(PENDING_ATTR, recipeId);\n}\n\nfunction unmarkPending(el) {\n el.removeAttribute(PENDING_ATTR);\n}\n\nfunction replaceCard(el, html) {\n const fragment = document.createRange().createContextualFragment(html);\n el.replaceWith(fragment);\n}\n\nasync function fetchRecipeCardHtml(headers, recipeId) {\n if (htmlByRecipeId.has(recipeId)) {\n return htmlByRecipeId.get(recipeId);\n }\n if (fetchInFlight.has(recipeId)) {\n return fetchInFlight.get(recipeId);\n }\n\n const promise = fetchSsrHtml(RECIPE_CARD_HTML_ENDPOINT, headers, {\n recipe_id: recipeId,\n store_id: getPosExtId(),\n variant: String(DISPLAY_RECIPE_VARIANT),\n }, getSsrBaseUrl())\n .then((html) => {\n htmlByRecipeId.set(recipeId, html);\n fetchInFlight.delete(recipeId);\n return html;\n })\n .catch((err) => {\n fetchInFlight.delete(recipeId);\n throw err;\n });\n\n fetchInFlight.set(recipeId, promise);\n return promise;\n}\n\nasync function fetchAndReplaceCard(headers, el, recipeId) {\n try {\n const html = await fetchRecipeCardHtml(headers, recipeId);\n replaceCard(el, html);\n } catch (err) {\n unmarkPending(el);\n console.warn(\n `[CoursesU] recipe-card-by-id SSR failed for recipe ${recipeId}`,\n err\n );\n }\n}\n\nfunction ensureStylesLoaded() {\n if (stylesLoaded) {\n return;\n }\n stylesLoaded = true;\n fetchSsrStyles(\n `${RECIPE_CARD_STYLES_ENDPOINT}?variant=${DISPLAY_RECIPE_VARIANT}`,\n getSsrBaseUrl()\n );\n}\n\nfunction ensureObserver(headers) {\n if (observerStarted) {\n return;\n }\n observerStarted = true;\n lastHeaders = headers;\n\n new MutationObserver(() => {\n clearTimeout(injectTimeout);\n injectTimeout = setTimeout(() => injectRecipeCardsById(lastHeaders), 100);\n }).observe(document.body, { attributes: false, childList: true, subtree: true });\n}\n\n/**\n * Replace legacy webc-miam-recipe-card tags (with mealz recipe-id) by SSR recipe cards.\n * Runs on any page; watches the DOM for dynamically inserted tags.\n */\nexport async function injectRecipeCardsById(headers) {\n lastHeaders = headers;\n ensureObserver(headers);\n\n const pendingCards = collectPendingCards();\n if (pendingCards.length === 0) {\n return;\n }\n\n ensureStylesLoaded();\n\n const cardsByRecipeId = new Map();\n for (const el of pendingCards) {\n const recipeId = getRecipeId(el);\n if (!recipeId) {\n continue;\n }\n markPending(el, recipeId);\n if (!cardsByRecipeId.has(recipeId)) {\n cardsByRecipeId.set(recipeId, []);\n }\n cardsByRecipeId.get(recipeId).push(el);\n }\n\n await Promise.all(\n [...cardsByRecipeId.entries()].flatMap(([recipeId, elements]) =>\n elements.map((el) => fetchAndReplaceCard(headers, el, recipeId))\n )\n );\n}\n","import \"./style.scss\";\nimport { initMealz } from \"./init-mealz\";\nimport {\n getPosExtId,\n isAvailable,\n waitForVariable,\n buildCoursesUSSRHeaders,\n clearPreferences,\n} from \"./utils\";\nimport { injectCatalog, listenHeaderHeightChange } from \"./catalog\";\nimport { injectPlanner } from \"./planner\";\nimport { initRecapPage, initRecipeRecapButton } from \"./recipe-recap\";\nimport { initShelvesCardInjection, prefetchRecipeCards } from \"./recipe-cards\";\nimport { initBasketTagInjection, prefetchRecipeTags } from \"./recipe-tags\";\nimport { injectOrderButtons, isOrderButtonsPage, prefetchOrderButtons } from \"./order-buttons\";\nimport { injectRecipeCardsById } from \"./recipe-card-by-id\";\nimport { fetchSsrStyles } from \"../../core/common/ssr-utils\";\nimport { getSsrBaseUrl } from \"./coursesu-env.js\";\n\n\n/*********************************** FEATURES DETECTION ***********************************/\n\nfunction isCatalogPage() {\n return window.location.href.includes('/idees-repas.html');\n}\n\nfunction isPlannerPage() {\n return window.location.href.includes('/budget-repas.html');\n}\n\nfunction isBasketPage() {\n return window.location.href.includes('/panier');\n}\n\n/**\n * Per-page SSR fetch + script injection.\n */\nasync function fetchFeaturesHTML(userId) {\n const headers = await buildCoursesUSSRHeaders(userId);\n\n if (isCatalogPage()) {\n await injectCatalog(headers);\n }\n else if (isPlannerPage()) {\n await injectPlanner(headers);\n }\n else if (isBasketPage()) {\n await prefetchRecipeTags(headers);\n }\n else {\n await prefetchRecipeCards(headers);\n }\n\n if (isOrderButtonsPage() && (getPosExtId()?.length === 0 || await isAvailable())) {\n await prefetchOrderButtons(headers);\n }\n\n await injectRecipeCardsById(headers);\n}\n\n/** ************************************ VARIABLES DETECTION ***********************************/\n\n/**\n * We need to access window.tc_vars.user_id to init Mealz and it is not set on page startup\n * So we need to wait for it to be defined\n */\nfunction keyVariablesAreDefined(callback) {\n waitForVariable(window, 'tc_vars', 100, 25, (tcVarsDefined) => {\n if (tcVarsDefined) {\n waitForVariable(window.tc_vars, 'user_id', 100, 25, callback);\n }\n });\n}\n\n/**\n * Wait until globalThis.mealz has been populated by the SSR-loaded module\n * scripts before invoking the lib-dependent code.\n */\nfunction checkForMealz(callback) {\n waitForVariable(globalThis, 'mealz', 100, 50, (mealz) => {\n if (mealz === undefined) {\n console.error('[Mealz Injector] globalThis.mealz never became available');\n return;\n }\n callback();\n });\n}\n\n\n/*********************************** MAIN SCRIPT ***********************************/\n\n// We wait for the userId to be defined to be sure CoursesU have filled their variables\nkeyVariablesAreDefined(async (user_id) => {\n await clearPreferences(user_id);\n\n await fetchSsrStyles(\"/v3/styles/base\", getSsrBaseUrl());\n\n const userId = globalThis.loggedIn === true ? user_id : undefined;\n await fetchFeaturesHTML(userId);\n\n checkForMealz(async () => {\n try {\n await initMealz();\n } catch (error) {\n console.error('[Mealz Injector] Error in main script initialization:', error);\n }\n\n // initRecipeRecapButton(); TODO PUT BACK\n if (window.location.href.includes('mes-repas')) {\n initRecapPage();\n }\n\n if (getPosExtId()?.length === 0 || await isAvailable()) {\n await initShelvesCardInjection();\n initBasketTagInjection();\n if (isOrderButtonsPage()) {\n injectOrderButtons();\n }\n if (isCatalogPage()) {\n listenHeaderHeightChange();\n }\n }\n });\n});\n"],"names":["handlePayment","isOnConfirmationPage","hasOrderAmount","Array","isArray","window","dataLayer","paymentEvent","find","ev","console","log","hasPayment","mealz","basketSync","paymentTotal","pushProductsToBasket","retailerProducts","partners","setQuantityOfProducts","map","p","pid","id","quantity","getBasketProducts","product","returnCartDetails","productId","tc_vars","order_total_amount_ati","value","basket_amount","page_type","error","warn","_configJson","_retrieveConfigJson","Promise","resolve","url","location","href","prodBucketPath","includes","_configUrl","xhr","XMLHttpRequest","open","onload","JSON","parse","responseText","onerror","available_stores","available_shelves","available_searches","send","async","_retrieveConfigJsonIfNecessary","loadedScriptsKey","getLoadedSet","w","globalThis","Object","defineProperty","Set","writable","enumerable","configurable","_","ensureModuleScriptLoaded","src","document","loaded","has","scripts","querySelectorAll","from","some","s","getAttribute","hasScriptInDom","add","reject","script","createElement","type","err","head","appendChild","loadModuleScriptsFromHtml","html","doc","DOMParser","parseFromString","root","uniqueSrcs","filter","Boolean","all","loadModuleScriptsFromElement","srcs","re","m","exec","push","SESSION_STORAGE_KEY","getOrCreateSessionId","sessionId","sessionStorage","getItem","fallbackSessionId","Date","now","Math","random","toString","slice","crypto","randomUUID","setItem","debug","AUTHLESS_STORAGE_KEY","pendingAuthlessFetch","getOrCreateAuthlessId","supplierToken","baseUrl","storedAuthlessId","resolvedBaseUrl","env","ssr","Error","response","fetch","method","headers","ok","status","statusText","payload","json","authlessId","authless_id","fetchAuthlessToken","then","finally","buildSsrHeaders","language","userId","extraHeaders","removeItem","clearStoredAuthlessId","fetchSsrHtml","endpoint","params","search","URLSearchParams","entries","forEach","k","v","append","String","res","text","fetchSsrStyles","links","TypeError","existingHrefs","el","linkEl","rel","applySsrStyleLinksToHead","waitForElement","selector","maxAttempts","intervalMs","attempt","tryFind","querySelector","setTimeout","SSR_BASE_URLS","dev","uat","prod","SUPPLIER_TOKEN_BASE","supplierId","origin","noSupplier","orderHistory","resolveCoursesUEnv","override","documentElement","readPluginEnvOverride","URL","hostname","resolveEnvFromHost","getSsrBaseUrl","getCoursesUSupplierToken","domain","btoa","stringify","getCookie","name","cookieString","cookie","parts","split","chunk","part","trim","eqIndex","indexOf","substring","raw","decodeURIComponent","getPosExtId","isAvailable","getAvailableStores","waitForVariable","object","property","delay","times","callback","interval","setInterval","clearInterval","AB_STORAGE_KEY","PLANNER_ENTRY_AB_STORAGE_KEY","syncForbidProfiling","MEALZ","forbidProfiling","privacyCenter","isProfilingAllowed","loggedIn","user_id","user","updateForbidProfiling","initMealzBasketSync","definePushProductsToCart","mutationTarget","getElementsByClassName","MutationObserver","retailerBasketChanged","observe","attributes","childList","subtree","listenToRetailerBasket","resetBasket","basket","reset","button","offsetParent","addEventListener","body","resetOnEmptyBasket","paymentStarted","initAbTesting","abConfig","getAbCssUrl","localStorage","max","keys","length","rand","floor","version","abTestKey","analytics","setAbTestKey","link","injectCss","plannerEntryVariants","variantsConfig","variant","normalizeAbVariants","getPlannerEntryAbVariants","currentVariant","assignedVariant","initMealz","config","mealzLogs","hook","setHookCallback","isLogged","isPosValid","click","hookCallback","setForcePosCallback","posExtId","csrfToken","getElementsByName","fullUrl","encodeURI","credentials","Accept","Pragma","referrer","mode","reload","forcePosCallback","router","setRecipeCatalogUrl","setRetailerCartUrl","initMealzOptionals","COURSESU_CATALOG_ROUTES","home","section","htmlEndpoint","stylesEndpoint","list","category","mySpace","buildForwardedQueryParams","searchParams","key","categorie","category_id","match","RECIPE_CATALOG_PLACEHOLDER","injectCatalog","target","get","values","routeSection","getCatalogSsrEndpoints","max_recipes_per_category","recipe_card_variant","planner_entry_variant","store_id","insertAdjacentHTML","remove","listenHeaderHeightChange","headerElement","bottom","getBoundingClientRect","setStickyHeaderHeight","waitForStickyHeaderAnimation","parentElement","timesLeft","MEALS_PLANNER_PLACEHOLDER","PAGE_TEMPLATE","createRange","createContextualFragment","recapLastNumberOfRecipes","initRecapPage","pagePlaceholder","getElementById","updateRecapPage","recipeCount","confirmOrderButton","continueButton","removeAllButton","initButtonListeners","replaceWith","injectPageFragment","subscribe","openDisplayOnClickInRecap","counter","recipesCount","classList","innerHTML","initRecipeCounter","items","item","recipes","openDetails","page","previewBlockHeader","leftHeader","rightCardStats","nbOfMeals","RECIPE_CARD_MULTIPLE_HTML_ENDPOINT","productsAndCardPositions","ssrCardsById","hiddenPositions","injectTimeout","removeTimeout","initShelvesCardInjection","cardsPositionsByScreenWidth","injectCards","clearTimeout","card","removeCardsIfNecessary","prefetchRecipeCards","container","contexts","listChildren","products","getProductsInList","position","precedingProduct","positionOfPrecedingProduct","followingProduct","productIds","getProductsIds","cardPosition","buildRecipeCardContexts","children","data","fetchRecipeCardMultiple","fromEntries","Number","i","cardMainContainer","getCardMainContainer","productAtPosition","x","dataset","tcProductTile","intendedPosition","getProductsAndCardsInList","cardContainer","searchExistingCardForPosition","productsIds","createCard","after","insertCardAfterProduct","injectCardIfNecessary","itemid","RECIPE_TAGS_ENDPOINT","ssrTagsByProductId","currentlyInjecting","newInjectionToProcess","isBasketPage","prefetchRecipeTags","ids","row","collectProductIds","product_ids","fetchRecipeTagsMultiple","injectRecipesTags","cartRows","tagContainer","ensureTagContainers","extId","applyTagsFromCache","seenCoursesURecipes","htmlByRecipeName","Map","fetchInFlight","lastHeaders","stylesLoaded","observerStarted","parsers","waitSelector","findRecipes","element","textContent","isOrderButtonsPage","getParser","findRecipesOnPage","parser","recipe","fetchButtonHtml","recipeName","promise","recipe_name","set","delete","catch","prefetchOrderButtons","waitForRecipeElements","recipeNames","injectOrderButtons","checkForCoursesURecipes","injectButton","PENDING_ATTR","htmlByRecipeId","getRecipeId","recipeId","markPending","setAttribute","fetchAndReplaceCard","recipe_id","fetchRecipeCardHtml","fragment","replaceCard","removeAttribute","unmarkPending","injectRecipeCardsById","ensureObserver","pendingCards","cardsByRecipeId","flatMap","elements","isCatalogPage","fetchFeaturesHTML","buildCoursesUSSRHeaders","injectPlanner","clearPreferences","initBasketTagInjection","tcVarsDefined"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ const r={carrefour:{token:btoa(JSON.stringify({supplierId:24,origin:"carrefour",domain:"miam.carrefour.web"}))},coursesu:{token:btoa(JSON.stringify({supplierId:7,origin:"coursesu",domain:globalThis.location.href.includes("https://www.coursesu.com/")?"miam.coursesu.web":"miam.test",noSupplier:!1,orderHistory:!0}))},monoprix:{domain:"miam.monoprix.web",alSupplierId:10,nonalSupplierId:11},ssr:{baseUrl:"https://ssr-api.mealz.ai"}};export{r as e};
2
+ //# sourceMappingURL=mealz-injector-environment.js.map