PageSourceSearch

https://kebchi.fr/assets/js/app.js?v=20260703b

js kebchi.fr collected 2026-09-25 07:57:55 UTC 33,026 bytes, 1 lines download raw bytes

1const throttle=(e,t=200)=>{let n=0;return(...a)=>{const r=Date.now();r-n>=t&&(n=r,e(...a))}},initLegacyMenu=()=>{const e=document.querySelector("[data-menu-toggle]"),t=document.querySelector("[data-mobile-menu]");if(!e||!t)return;const n=()=>{t.classList.remove("is-open"),e.classList.remove("is-open"),e.setAttribute("aria-expanded","false"),document.body.classList.remove("nav-locked")};e.addEventListener("click",()=>{t.classList.contains("is-open")?n():(t.classList.add("is-open"),e.classList.add("is-open"),e.setAttribute("aria-expanded","true"),document.body.classList.add("nav-locked"))}),document.addEventListener("click",a=>{t.contains(a.target)||e.contains(a.target)||n()});const a=t.querySelectorAll("[data-mobile-dropdown]");a.forEach(e=>{const t=e.querySelector(".donations")||e.querySelector(".mobile-dropdown-btn");t&&t.addEventListener("click",t=>{t.stopPropagation();const n=e.classList.contains("active")||e.classList.contains("is-open");a.forEach(e=>{e.classList.remove("active"),e.classList.remove("is-open")}),n||(e.classList.add("active"),e.classList.add("is-open"))})})},initHeroSlider=()=>{const e=document.querySelector("[data-hero-slider]");if(!e)return;const t=Array.from(e.querySelectorAll("[data-hero-slide]")),n=e.querySelector("[data-hero-prev]"),a=e.querySelector("[data-hero-next]"),r=e.querySelector("[data-hero-dots]"),o=Number(e.getAttribute("data-hero-autoplay")||7);let i,c=0;const s=(e,n=!1)=>{t.length&&(c=(e+t.length)%t.length,t.forEach((e,t)=>e.classList.toggle("is-active",t===c)),r&&Array.from(r.children).forEach((e,t)=>{e.classList.toggle("is-active",t===c)}),n&&l())},l=()=>{o&&(clearInterval(i),i=setInterval(()=>s(c+1),1e3*o))};r&&(r.innerHTML="",t.forEach((e,t)=>{const n=document.createElement("button");n.type="button",n.addEventListener("click",()=>s(t,!0)),r.appendChild(n)})),s(0),l(),n&&n.addEventListener("click",()=>s(c-1,!0)),a&&a.addEventListener("click",()=>s(c+1,!0));const d=e.querySelector(".hero-slider__viewport")||e;let u=null,m=null;d.addEventListener("touchstart",e=>{const t=e.touches[0];u=t.clientX,m=t.clientY},{passive:!0}),d.addEventListener("touchmove",e=>{if(null===u||null===m)return;const t=e.touches[0],n=t.clientX-u,a=Math.abs(t.clientY-m);Math.abs(n)>40&&Math.abs(n)>a&&(s(c+(n<0?1:-1),!0),u=m=null)},{passive:!0}),d.addEventListener("touchend",()=>{u=m=null})},initHeroCarouselSwiper=()=>{"undefined"!=typeof Swiper&&document.querySelectorAll(".hero-carousel.swiper").forEach(e=>{const t=e.querySelectorAll(".swiper-slide"),n=e.querySelector(".swiper-pagination"),a=t.length>1,r=new Swiper(e,{loop:a,autoplay:!!a&&{delay:4500},pagination:n?{el:n,clickable:!0}:void 0});return!a&&n&&(n.style.display="none"),r})},initActionSections=()=>{document.querySelectorAll("[data-actions]").forEach(e=>{const t=e.querySelector("[data-action-track]"),n=Array.from(e.querySelectorAll("[data-action-filter]")),a=e.querySelector("[data-action-prev]"),r=e.querySelector("[data-action-next]"),o=e.querySelector("[data-action-dots]"),i=e.querySelector("[data-action-more]"),c=e.querySelector("[data-action-tabs]");if(!t)return;const s=window.matchMedia("(min-width: 1024px)"),l=()=>s.matches,d=Array.from(t.children).map(e=>({category:e.dataset.actionCategory||"all",html:e.outerHTML}));let u=[];const m={index:0,maxIndex:0};let p;const y=(e="all")=>{const n=d.filter(t=>"all"===e||t.category===e),a=n.length?n:d;t.innerHTML=a.map(e=>e.html).join(""),u=Array.from(t.children),m.index=0,t.scrollLeft=0,u.forEach(e=>{const t=e.querySelector(".action-card__cta");t&&(e.style.cursor="pointer",e.addEventListener("click",e=>{t.contains(e.target)||t.click()}))}),v(!0),h()},v=(e=!1)=>{if(!l())return t.style.transition="",t.style.transform="",a&&(a.disabled=!1),void(r&&(r.disabled=!1));const n=(()=>{const e=u[0];if(!e)return 0;const n=parseFloat(getComputedStyle(t).columnGap||"0");return e.offsetWidth+n})();if(!n)return;const i=Math.max(1,Math.round(t.clientWidth/n));m.maxIndex=Math.max(0,u.length-i),m.index=Math.min(m.index,m.maxIndex),t.style.transition=e?"none":"transform 0.45s ease",t.style.transform=`translateX(-${m.index*n}px)`,a&&(a.disabled=0===m.index),r&&(r.disabled=m.index===m.maxIndex),(()=>{if(!o)return;if(o.innerHTML="",!l())return;
1const e=m.maxIndex+1;if(!(e<=1))for(let t=0;t<e;t++){const e=document.createElement("button");t===m.index&&e.classList.add("is-active"),e.addEventListener("click",()=>{m.index=t,v()}),o.appendChild(e)}})()},f=e=>{if(!l())return void t.scrollBy({left:e*t.clientWidth*.8,behavior:"smooth"});if(m.maxIndex<=0)return;const n=m.index+e;m.index=Math.min(Math.max(0,n),m.maxIndex),v()},h=()=>{clearInterval(p),!l()||u.length<=1||(p=setInterval(()=>{m.index=(m.index+1)%Math.max(1,m.maxIndex+1),v()},5e3))};n.forEach(e=>{e.addEventListener("click",()=>{const t=e.dataset.actionFilter||"all";(e=>{n.forEach(t=>{const n=(t.dataset.actionFilter||"all")===e;t.classList.toggle("is-active",n)})})(t),y(t)})}),a&&a.addEventListener("click",()=>f(-1)),r&&r.addEventListener("click",()=>f(1));const b=throttle(()=>v(!0),150);if(window.addEventListener("resize",b),s.addEventListener("change",b),i&&c){const e=()=>{const e=!l(),t="true"===i.getAttribute("aria-expanded");if(i.style.display=e?"inline-flex":"none",i.textContent=t?"-":"+",!e)return c.classList.remove("is-expanded","is-collapsed"),void n.forEach(e=>e.style.display="");t?(c.classList.add("is-expanded"),c.classList.remove("is-collapsed"),n.forEach(e=>e.style.display="")):(c.classList.add("is-collapsed"),c.classList.remove("is-expanded"),n.forEach(e=>{const t=e.classList.contains("actions__tab--extra");e.style.display=t?"none":""}))};i.addEventListener("click",()=>{const t="true"===i.getAttribute("aria-expanded");i.setAttribute("aria-expanded",(!t).toString()),e()}),s.addEventListener("change",e),e()}(()=>{let e=null,n=null;const a=(t,a)=>{e=t,n=a},r=(t,a)=>{if(null===e||null===n)return;const r=t-e,o=Math.abs(a-n);Math.abs(r)>40&&Math.abs(r)>o&&(f(r<0?1:-1),e=n=null)},o=()=>{e=n=null};t.addEventListener("touchstart",e=>{const t=e.touches[0];a(t.clientX,t.clientY)},{passive:!0}),t.addEventListener("touchmove",e=>{const t=e.touches[0];r(t.clientX,t.clientY)},{passive:!0}),t.addEventListener("touchend",o,{passive:!0}),t.addEventListener("mousedown",e=>{0===e.button&&a(e.clientX,e.clientY)}),window.addEventListener("mousemove",t=>{null!==e&&r(t.clientX,t.clientY)}),window.addEventListener("mouseup",o)})(),y("all")})},initReveal=()=>{if("undefined"==typeof IntersectionObserver)return;document.querySelectorAll("section:not([data-no-reveal])").forEach(e=>{e.classList.contains("reveal")||e.classList.add("reveal")});const e=new IntersectionObserver(e=>{e.forEach(e=>{e.isIntersecting&&e.target.classList.add("active")})},{threshold:.15});document.querySelectorAll(".reveal").forEach(t=>e.observe(t))},initBackToTop=()=>{const e=document.getElementById("backToTop");if(!e)return;const t=()=>{window.scrollY>300?e.classList.add("is-visible"):e.classList.remove("is-visible")};window.addEventListener("scroll",t,{passive:!0}),t(),e.addEventListener("click",e=>{e.preventDefault(),window.scrollTo({top:0,behavior:"smooth"})})},initSmoothAnchors=()=>{document.querySelectorAll('a[href^="#"]').forEach(e=>{e.addEventListener("click",t=>{const n=e.getAttribute("href").slice(1);if(!n)return;const a=document.getElementById(n);a&&(t.preventDefault(),a.scrollIntoView({behavior:"smooth",block:"start"}))})})},initCartAjax=()=>{if(window.__cartBindings)return void window.__cartBindings();window.__cartInitialized=!0,window.__cartSubmitDelegated||(document.addEventListener("submit",e=>{const t=e.target&&"function"==typeof e.target.closest?e.target.closest("[data-cart-form]"):null;if(!t)return;const n=t.getAttribute("data-cart-form")||"";e.preventDefault(),e.stopPropagation();let a=!1;if("function"==typeof window.__cartRouter)try{a=!0===window.__cartRouter(n,t)}catch(e){console.error(e)}a||t.dispatchEvent(new CustomEvent("cart:submit",{bubbles:!1}))},!0),window.__cartSubmitDelegated=!0),document.querySelectorAll("[data-cart-form]").forEach(e=>{const t=e.querySelector('button[type="submit"]');if(!t||e.querySelector(".btn-donate-now"))return;const n=document.createElement("button");n.type="button",n.className=t.className+" btn-donate-now",n.textContent="Donner maintenant",n.addEventListener("click",()=>{window.__redirectAfterCart=!0,e.requestSubmit(t)});const a=document.createElement("div");
1a.className="cart-btns-row",t.parentNode.insertBefore(a,t),a.appendChild(t),a.appendChild(n)});const e=()=>"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,e=>{const t=16*Math.random()|0;return("x"===e?t:3&t|8).toString(16)}),t=(e="")=>String(e).replace(/<[^>]*>/g,"").trim();const n=()=>{try{return JSON.parse(localStorage.getItem("cart"))||[]}catch{return[]}},a=e=>{localStorage.setItem("cart",JSON.stringify(e))},r=()=>"1"===localStorage.getItem("fees_opt_out"),o=e=>{e?localStorage.setItem("fees_opt_out","1"):localStorage.removeItem("fees_opt_out")},i=e=>{const t=e.filter(e=>73===e.product_id),n=e.filter(e=>73!==e.product_id);return 0===t.length||r()?n:[...n,t[0]]},c=()=>{const e=i(n());let t=0,a=0;const r=e.map(e=>{const n=Number(e.quantity)||1,r=Number(e.price)||0;return t+=r*n,function(){var d=e.details||{};if(d.region&&typeof d.videos_offertes!=="undefined"&&d.video&&d.videos_payantes>0&&n<5){var vo=Math.min(n-1,2);t+=Math.max(0,n-vo)*20}}(),a+=n,{id:e.id,product_id:e.product_id||e.id,line_id:e.id,name:e.name||"Produit",quantity:n,unit_price:r,details:e.details||{}}});return{count:a,total:t,items:r}},s=e=>{try{return new Intl.NumberFormat("fr-FR",{minimumFractionDigits:2,maximumFractionDigits:2}).format(e)+" €"}catch(t){return(Number(e)||0).toFixed(2).replace(".",",")+" €"}},l=e=>(e??"").toString().replace(/[&<>"']/g,e=>({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"}[e]||e)),d={procuration:"Procuration",beneficiaires:"Bénéficiaires",beneficiaire:"Bénéficiaire",frequency:"Fréquence",format:"Format",montant:"Montant",repartition:"Répartition",allocation:"Répartition",plan:"Plan",source:"Source",cycle:"Cycle",mode:"Mode",type:"Type",size:"Taille",cagnotte_slug:"Cagnotte",gender:"Genre",parent_name:"Nom du parent",nomParent:"Nom du parent",child_name:"Prénom enfant",prenomEnfant:"Prénom enfant",birthdate:"Date de naissance",dateNaissance:"Date de naissance",momentMaghreb:"Né(e)",plaque:"Plaque commémorative",arbre:"Arbre",pack:"Pack",pays:"Pays",co2:"CO2 compens?",intention:"Intention",ispack:"Pack",nbarbres:"Nb arbres",region:"Région",lieu_retrait:"Lieu de retrait"},u=e=>{if(!e)return"";const t=e.toString().toLowerCase();if(d[t])return d[t];const n=t.replace(/_/g," ");return n.charAt(0).toUpperCase()+n.slice(1)},m=e=>{if(!e||"object"!=typeof e)return"";const t=["_unit_price","_override_name","__skip_ga","_emoji","isPack","nbArbres","type"],n=Object.entries(e).filter(([e,n])=>!t.includes(e)&&""!==n&&null!=n);if(!n.length)return"";return`<ul class="prod-meta">${n.map(([e,t])=>{const n=l(u(e)),a=null==(r=t)?"":Array.isArray(r)?r.join(", "):"object"==typeof r?Object.entries(r).map(([e,t])=>`${u(e)}: ${t}`).join(" | "):r.toString();var r;if("string"==typeof a&&a.includes("|")){return`<li>${n} :<ul style="margin:4px 0 0 16px;padding:0;list-style:disc;">${a.split("|").map(e=>e.trim()).filter(Boolean).map(e=>`<li>${l(e)}</li>`).join("")}</ul></li>`}return`<li>${n} : ${l(a)}</li>`}).join("")}</ul>`};let p=null,y=null;const v=(e,t="success")=>{p||(p=document.createElement("div"),p.id="cartToast",p.className="cart-toast cart-toast--success",p.setAttribute("role","status"),p.setAttribute("aria-live","polite"),p.tabIndex=0,p.addEventListener("click",()=>{"1"===p.dataset.redirect&&(window.location.href="/donner/index.html")}),document.body.appendChild(p)),p.dataset.redirect="error"===t?"0":"1",p.textContent=e,p.classList.remove("cart-toast--success","cart-toast--error"),p.classList.add("error"===t?"cart-toast--error":"cart-toast--success"),p.classList.remove("is-visible"),requestAnimationFrame(()=>{p.classList.add("is-visible")}),y&&clearTimeout(y),y=setTimeout(()=>{p.classList.remove("is-visible")},2600)};window.showCartToast=v;let f={60:{name:"Mouton solidaire",price:179},70:{name:"Cheveux d'or",price:110}};(async()=>{try{const e=await fetch("/inc/api_produits.php");if(!e.ok)return void console.warn("API produits not available, using fallback catalog");const t=(await e.json()).tous||[];f={},t.forEach(e=>{e.id&&e.nom&&e.prix&&(f[e.id]={name:e.nom,price:parseFloat(e.prix)},e.variante_label&&(f[e.id].name+=" - "+e.variante_label))}),console.log("✅ Product catalog loaded from database:",Object.keys(f).length,"products")}catch(e){console.error("❌ Failed to load product catalog:",e),console.warn("Using fallback catalog with default products")}})();const h=new Set([2,3,4,5,6,7,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,101,102,103,104,105,106]),b={49:"🐑",50:"🐑",51:"💧",52:"💧",59:"🎁",60:"🐑",61:"📦",62:"📦",63:"📦",64:"📦",65:"📦",66:"📦",67:"📦",68:"📦",69:"🧒",70:"✨",71:"🍲",72:"⭐",73:"💳",74:"🕌"},q=(e="",t)=>{const n=Number(t);if(b[n])return b[n];if(h.has(n))return"🌳";const a=e.toLowerCase();return a.includes("cagnotte")?"💦":a.includes("kebchi")?"⭐":a.includes("puits")||a.includes("puit")?"💧":a.includes("arbre")?"🌳":a.includes("colis")?"📦":a.includes("orphelin")||a.includes("parrain")?"🧒":a.includes("mouton")||a.includes("aqiqa")?"🐑":a.includes("fidya")?"🍲":a.includes("zakat")?"🕌":a.includes("cheveux")?"✨":(a.includes("don libre"),"🎁")},g=e=>{if(!e)return;const t=document.querySelector("[data-cart-count]"),n=document.querySelectorAll("[data-cart-total]"),a=document.querySelector("[data-cart-list]");
1if(t&&(t.textContent=e.count??0),n.forEach(t=>t.textContent=s(e.total??0)),a){const t=e.items||[],n={cagnotte:"💦",puits:"💧",arbre:"🌳",colis:"🧺",orphelin:"🧒",parrain:"🧒",aqiqa:"🐑",mouton:"🐑",fidya:"🍽","don libre":"🎁",cheveux:"✨",kebchi:"⭐"},r=e=>{const t=(e||"").toLowerCase();let n=e||"";return t.includes("cagnotte")?n="Cagnotte":t.includes("kebchi")&&t.includes("+")?n="Kebchi+":t.includes("puits")&&(t.includes("4x")||t.includes("4 x"))?n="Puit - 4x":t.includes("puits")?n="Puit":t.includes("parrain")?n="Parrainage orphelin":t.includes("abonnement")&&t.includes("orphelin")?n="Abonnement Orphelins":t.includes("abonnement")&&t.includes("colis")&&t.includes("petit")?n="Abonnement colis (Petit)":t.includes("abonnement")&&t.includes("colis")&&(t.includes("standard")||t.includes("moyen"))?n="Abonnement colis (Standard)":t.includes("abonnement")&&t.includes("colis")&&(t.includes("grand")||t.includes("maxi"))?n="Abonnement colis (Maxi)":t.includes("colis")&&t.includes("petit")?n="Colis alimentaire (Petit)":t.includes("colis")&&(t.includes("standard")||t.includes("moyen"))?n="Colis alimentaire (Standard)":t.includes("colis")&&(t.includes("grand")||t.includes("maxi"))?n="Colis alimentaire (Maxi)":t.includes("colis")&&t.includes("orphelin")?n="Colis Orphelins":t.includes("colis")?n="Colis alimentaire":t.includes("cheveux")?n="Cheveux d'or":t.includes("fidya")?n="Fidya":t.includes("zakat")?n="Zakat al Fitr":t.includes("don libre")?n="Don libre":t.includes("mouton")&&(n="Mouton solidaire"),n};t.length?a.innerHTML=t.map(e=>{const t=e.name??"",a=e.quantity??0,o=e.unit_price??0,i=e.emoji||e.details?._emoji||q(t,e.product_id||e.id||0)||"🎁",c=t.toLowerCase(),l=(Object.entries(n).find(([e])=>e&&c.includes(e)),a*o);return`\n<li class="cart-preview__item">\n<div class="cart-preview__item-main">\n<div class="cart-preview__badge">${i}</div>\n<div class="cart-preview__texts">\n<span class="cart-preview__name">${r(t)}</span>\n<span class="cart-preview__meta">${a} x ${s(o)}</span>\n</div>\n</div>\n<div class="cart-preview__price">${s(l)}</div>\n</li>`}).join(""):a.innerHTML='<li class="cart-preview__empty">Votre panier est vide</li>'}},S=(t,r=1,o={})=>{try{let s=n();const l=f[t]||{name:"Produit",price:0};let d=l.price;o._unit_price&&(d=Number(o._unit_price));let u=l.name;o._override_name&&(u=o._override_name);const m={id:e(),product_id:t,name:u,price:d,quantity:r,details:o};s.push(m),s=i(s),a(s);const p=c();return g(p),x(p),v("Produit ajouté au panier"),window.__redirectAfterCart?(window.__redirectAfterCart=!1,window.location.href="/donner/index.html",p):(!0!==o?.__skip_ga&&void 0!==window.dataLayer&&window.dataLayer.push({event:"add_to_cart",ecommerce:{currency:"EUR",value:d*r,items:[{item_id:String(t),item_name:u,price:d,quantity:r}]}}),"undefined"!=typeof fbq&&fbq("track","AddToCart",{content_name:u,content_ids:[String(t)],content_type:"product",value:d*r,currency:"EUR"}),"undefined"!=typeof snaptr&&snaptr("track","ADD_CART",{price:d*r,currency:"EUR",item_ids:[String(t)]}),"undefined"!=typeof (window._learnq=window._learnq||[]).push(["track","Added to Cart",{"AddedItemProductName":u,"AddedItemProductID":String(t),"AddedItemSKU":String(t),"AddedItemCategories":["Donation"],"AddedItemURL":window.location.href,"AddedItemImageURL":o._image_url||"","AddedItemPrice":d,"AddedItemQuantity":r,"ItemNames":[u],"CheckoutURL":"https://www.kebchi.fr/donner/","Items":[{"ProductID":String(t),"SKU":String(t),"ProductName":u,"Quantity":r,"ItemPrice":d,"RowTotal":d*r,"ProductURL":window.location.href,"ImageURL":o._image_url||"","Categories":["Donation"]}]}]),p)}catch(e){return console.error(e),v("Erreur lors de l'ajout au panier","error"),null}};window.__cartRouter||(window.__cartRouter=(e,t)=>{if(!e||!t)return!1;if("colis-alimentaire"===e){const e={petit:{once:63,monthly:64},standard:{once:65,monthly:66},maxi:{once:67,monthly:68}},n=t.querySelector("#colis-format"),a=(n?.value||"petit").toLowerCase(),r="monthly"===t.querySelector('input[name="frequency"]:checked')?.value?"monthly":"once",o=Math.max(1,parseInt(t.querySelector("#colis-alim-qty")?.value||"1",10)||1),i=e[a]||e.petit,c=i[r]||i.once,s=n?.selectedOptions?.[0]?.textContent?.trim()||a;return S(c,o,{format:s,frequency:"monthly"===r?"Abonnement mensuel":"Don unique"}),!0}return!1});window.addToCartTreeCompat=(e,n=1,a="",r=!1,o=1)=>{!function(e,n,a){try{window.dataLayer=window.dataLayer||[],window.dataLayer.push({ecommerce:null});var r=Number(e.prix)||0,o=Number(n)||1,i=+(r*o).toFixed(2);window.dataLayer.push({event:"add_to_cart",ecommerce:{currency:"EUR",value:i,items:[{item_id:String(e.id),item_name:t(e.nom),price:r,quantity:o,item_category:a?"Pack":"Arbre"}]}})}catch(e){}}(e,n,r);const i=Number(e?.id),c=Math.max(1,Number(n)||1),s={__skip_ga:!0,_unit_price:Number(e?.prix)||0,_override_name:t(e?.nom||""),_emoji:e?.emoji||"",beneficiaires:a||"",isPack:!!r,nbArbres:Number(o)||1,type:r?"pack":"arbre"};return S(i,c,s)};const x=e=>{if(!e)return;const t=Number(e.total??0)||0,n=e.items||[],a=document.querySelector(".cart-count");if(a){const t=e.count??n.reduce((e,t)=>
1e+(Number(t.quantity)||0),0);a.textContent=`(${t} ${t>1?"articles":"article"})`}const r=document.querySelector("[data-cart-items-container]");if(r)if(n.length){const e='<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="3 6 5 6 21 6"/><path d="M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"/></svg>';r.innerHTML=n.map(t=>{const n=t.product_id??t.id??"",a=t.line_id??"",r=Number(t.quantity)||1,o=Number(t.unit_price)||0,i=r*o,c=t.name||"Produit",l=t.emoji||t.details?._emoji||q(c,n)||"🎁",d=t.details&&"object"==typeof t.details?t.details:{},u=m(d);return`\n<div class="product-card" data-cart-item data-product-id="${n}" data-line-id="${a}" data-unit-price="${o}">\n<div class="product-main-row">\n<div class="product-thumb">\n<div class="img-box img-box--emoji" aria-hidden="true" style="background:none;display:flex;align-items:center;justify-content:center;font-size:22px;">\n${l}\n</div>\n</div>\n<div class="product-info">\n<div class="info-top">\n<div>\n<h3 class="prod-title"><a href="#">${c}</a></h3>\n<div class="prod-specs">\n<div>Quantité : ${r}</div>\n<div>Prix unitaire : ${s(o)}</div>\n</div>\n${u}\n<div class="prod-price-mobile">${s(i)}</div>\n</div>\n</div>\n</div>\n<div class="product-controls-row" data-qty-row>\n<div class="price-desktop" data-line-total>${s(i)}</div>\n<div class="qty-stepper">\n<button type="button" data-qty-minus aria-label="Diminuer">-</button>\n<input type="number" value="${r}" min="1" readonly data-qty-input>\n<button type="button" data-qty-plus aria-label="Augmenter">+</button>\n</div>\n<button class="btn-trash-mobile" title="Supprimer" aria-label="Supprimer" data-remove-item>${e}</button>\n<button class="btn-trash-desktop" title="Supprimer" aria-label="Supprimer" data-remove-item>${e}</button>\n</div>\n</div>\n</div>`}).join("")}else r.innerHTML='\n<div class="empty-cart-card">\n<div class="empty-icon" aria-hidden="true">🛒</div>\n<div class="empty-text">\n<h3>Votre panier est vide</h3>\n<p>Ajoutez un projet ou une cause pour commencer votre don.</p>\n</div>\n</div>\n';document.querySelectorAll("[data-cart-subtotal]").forEach(e=>{e.textContent=t>0?s(t):""}),document.querySelectorAll("[data-cart-total]").forEach(e=>{e.textContent=s(t)}),w(),L()},_=(e,t=1,r=null)=>{try{let o=n();if(r){const e=o.findIndex(e=>e.id===r);-1!==e&&(t<=0?o.splice(e,1):o[e].quantity=t)}else{const n=o.findIndex(t=>t.product_id===e);-1!==n&&(t<=0?o.splice(n,1):o[n].quantity=t)}o=i(o),a(o);const s=c();return g(s),s}catch(e){return console.error(e),v("Erreur lors de la mise à jour","error"),null}},w=()=>{document.querySelectorAll("[data-cart-item]").forEach(e=>{const t=Number(e.getAttribute("data-product-id")),n=e.getAttribute("data-line-id");parseFloat(e.getAttribute("data-unit-price")||"0");if(!t)return;const a=e.querySelector("[data-qty-minus]"),r=e.querySelector("[data-qty-plus]"),o=e.querySelector("[data-qty-input]"),i=(e.querySelector("[data-line-total]"),e.querySelector(".prod-price-mobile"),()=>Math.max(1,parseInt(o?.value||"1",10)||1)),s=e=>{_(t,e,n);const a=c();g(a),x(a)};a&&a.addEventListener("click",()=>{const e=Math.max(1,i()-1);s(e)}),r&&r.addEventListener("click",()=>{const e=i()+1;s(e)}),o&&o.addEventListener("change",()=>{const e=Math.max(1,i());s(e)})})},L=()=>{document.querySelectorAll("[data-remove-item]").forEach(e=>{const t=e.cloneNode(!0);e.parentNode.replaceChild(t,e),t.addEventListener("click",e=>{e.preventDefault(),e.stopPropagation();const n=t.closest("[data-cart-item]"),a=Number(n?.getAttribute("data-product-id")),r=n?.getAttribute("data-line-id")||null;if(!n||!a)return;if(_(a,0,r),73===a){const e=document.querySelector("[data-fees-toggle]"),t=document.querySelector("[data-fees-amount]");e&&t&&(e.checked=!1,t.dataset.feesValue="0",t.textContent=""),o(!0)}const i=c();g(i),x(i)})})},E=()=>{(()=>{const e=(e,t)=>{e&&"1"!==e.dataset.cartBound&&(e.dataset.cartBound="1",e.addEventListener("submit",t),e.addEventListener("cart:submit",t))};document.querySelectorAll("form[data-cart-form]").forEach(e=>{if("1"===e.dataset.cartSubmitHooked)return;e.dataset.cartSubmitHooked="1";const t=e.querySelector("[data-colis-submit]")||e.querySelector('button[type="submit"]')||e.querySelector("button");t&&"button"===t.type&&t.addEventListener("click",t=>{t.preventDefault(),"function"==typeof e.requestSubmit?e.requestSubmit():e.dispatchEvent(new Event("submit",{cancelable:!0,bubbles:!0}))})});const t=document.querySelector('[data-cart-form="aqiqa"]');t&&e(t,e=>{e.preventDefault();const n=t.querySelector('input[name="gender"]:checked')?.value||"boy",a=t.querySelector('input[name="parent_name"]')?.value?.trim()||"",r=t.querySelector('input[name="child_
1name"]')?.value?.trim()||"",o=t.querySelector('input[name="child_birthdate"]')?.value?.trim()||"",i="avant"===(t.querySelector('input[name="time"]:checked')?.id||"avant")?"Avant Maghreb":"Après Maghreb";a&&r&&o?S("girl"===n?49:50,1,{gender:"girl"===n?"fille":"garçon",nomParent:a,prenomEnfant:r,dateNaissance:o,momentMaghreb:i}):v("Merci de renseigner Nom du parent, Prénom de l'enfant et Date de naissance.","error")});const n=document.querySelector('[data-cart-form="puits"]');n&&e(n,e=>{e.preventDefault();const t="4x"===(n.querySelector('input[name="paiement"]:checked')?.value||"once"),a=n.querySelectorAll("#plaques-container .plaque-field input"),r=a.length?Array.from(a).map(e=>e.value.trim()):[n.querySelector("#puits-plaque")?.value?.trim()||""];if(!r[0])return v("Veuillez renseigner le nom pour la plaque commémorative","error"),void(a[0]||n.querySelector("#puits-plaque"))?.focus();const o=Math.max(1,parseInt(n.querySelector("#puits-qty")?.value||"1",10)||1),i=t?52:51,c={mode:t?"4x sans frais":"Paiement unique",plaque:r.join(" | "),plaques:r.filter(e=>e)};S(i,o,c)});const a=document.querySelector('[data-cart-form="cagnotte"]');if(a){const t=a.querySelector("[data-don-input]"),n=a.querySelectorAll("[data-don-preset]"),r=59,o=a.dataset.cagnotteName||"Cagnotte",i=a.dataset.cagnotteSlug||"",c=a.dataset.cagnotteSource||"Cagnotte puits",s="💦",l=e=>{n.forEach(t=>{const n=Number(t.dataset.donPreset)===e;t.classList.toggle("is-active",n),t.classList.toggle("active",n)}),t&&(t.value=e)};if(n.forEach(e=>{e.addEventListener("click",()=>{const t=Number(e.dataset.donPreset||"0");t>0&&l(t)})}),t){t.addEventListener("input",()=>{n.forEach(e=>{e.classList.remove("is-active"),e.classList.remove("active")})});const e=Array.from(n).find(e=>e.classList.contains("is-active")||e.classList.contains("active"));e&&e.dataset.donPreset&&(t.value=e.dataset.donPreset)}e(a,async e=>{e.preventDefault();const n=Math.max(1,Math.floor(Number(t?.value||"0")));!n||n<1?v("Merci de saisir un montant (minimum 1 euro)","error"):await S(r,1,{_unit_price:n,_override_name:`${s} Cagnotte - ${o}`,type:"cagnotte",cagnotte_slug:i,source:c,montant:`${n} EUR`})&&(window.location.href="/donner/index.html")})}const r=document.querySelector('[data-cart-form="don-libre"]');if(r){const t=r.querySelector("#don-libre-amount"),n=r.querySelectorAll('input[name="montant"]'),a=document.getElementById("don-custom-amount"),o=()=>{const e=r.querySelector('input[name="montant"]:checked'),n="choix"===(e?.value||"");a&&(a.style.display=n?"block":"none"),!n&&t&&e?.value&&(t.value=e.value)};n.forEach(e=>e.addEventListener("change",o)),o(),e(r,e=>{e.preventDefault();const n=r.querySelector('input[name="montant"]:checked'),a="choix"===(n?.value||"")?t?.value||"0":n?.value||"0",o=Math.max(1,Number(a));o&&!Number.isNaN(o)?S(59,1,{_unit_price:o,montant:`${o.toFixed(2)} EUR`,source:"Don libre"}):v("Merci de saisir un montant (minimum 1 EUR)","error")})}const o=document.querySelector('[data-cart-form="mouton"]');o&&e(o,e=>{e.preventDefault();const t=Math.max(1,parseInt(o.querySelector("#mouton-qty")?.value||"1",10)||1),n=o.querySelector("#mouton-procuration")?.value?.trim()||"";if(!n)return v("Veuillez renseigner le nom pour la procuration","error"),void o.querySelector("#mouton-procuration")?.focus();S(60,t,{procuration:n})});const i=document.querySelector('[data-cart-form="colis-orphelins"]');i&&e(i,e=>{e.preventDefault();const t="monthly"===i.querySelector('input[name="frequency"]:checked')?.value?"monthly":"once",n=Math.max(1,parseInt(i.querySelector("#colis-orphelins-qty")?.value||"1",10)||1);S("monthly"===t?62:61,n,{frequency:"monthly"===t?"Abonnement mensuel":"Don unique"})});const c=document.querySelector('[data-cart-form="colis-alimentaire"]');if(c){const t={petit:{once:63,monthly:64},standard:{once:65,monthly:66},maxi:{once:67,monthly:68}};e(c,e=>{e.preventDefault();const n=c.querySelector("#colis-format"),a=(n?.value||"petit").toLowerCase(),r="monthly"===c.querySelector('input[name="frequency"]:checked')?.value?"monthly":"once",o=Math.max(1,parseInt(c.querySelector("#colis-alim-qty")?.value||"1",10)||1),i=t[a]||t.pet
1it,s=i[r]||i.once,l=n?.selectedOptions?.[0]?.textContent?.trim()||a;S(s,o,{format:l,frequency:"monthly"===r?"Abonnement mensuel":"Don unique"})})}const s=document.querySelector('[data-cart-form="parrainage"]');s&&e(s,e=>{e.preventDefault();const t=Math.max(1,parseInt(s.querySelector("#parrainage-qty")?.value||"1",10)||1);S(69,t,{frequency:"Abonnement mensuel"})});const l=document.querySelector('[data-cart-form="cheveux"]');l&&e(l,e=>{e.preventDefault();const t=Math.max(1,parseInt(l.querySelector("#cheveux-qty")?.value||"1",10)||1);S(70,t,{})});const d=document.querySelector('[data-cart-form="fidya"]');d&&e(d,e=>{e.preventDefault();const t=d.querySelector('input[name="fidya-jours"]:checked');let n=1;n=t&&"custom"!==t.value?parseInt(t.value,10)||1:Math.max(1,parseInt(d.querySelector("#fidya-qty")?.value||"1",10)||1),S(71,n,{type:"9 € / jour",jours:n})});const m=document.querySelector('[data-cart-form="zakat"]');m&&e(m,e=>{e.preventDefault();const t=m.querySelector('input[name="zakat-nb"]:checked');let n=1;n=t&&"custom"!==t.value?parseInt(t.value,10)||1:Math.max(1,parseInt(m.querySelector("#zakat-qty")?.value||"1",10)||1),S(74,n,{type:"7 € / personne",personnes:n})});const k=document.querySelector('[data-cart-form="kaffara"]');k&&e(k,e=>{e.preventDefault();const n=typeof Products!=="undefined"&&Products.loaded?Products.getByCode("kaffara"):null;if(!n?.id)return void v("Produit non disponible, veuillez r\u00e9essayer.","error");const r=Math.max(1,parseInt(k.querySelector("#kaffara-qty")?.value||"1",10)||1);S(n.id,r,{type:(n.prix_unitaire||n.prix||5)+"\u20ac / repas",repas:r})});const p=document.querySelector('[data-cart-form="abonnement"]');if(p){const t=()=>{const e={};return document.querySelectorAll("[data-ab-alloc]").forEach(t=>{const n=t.dataset.abAlloc;e[n]=Number(t.value||"0")}),e},n=e=>Object.entries(e).map(([e,t])=>`${u(e)} ${t}%`).join(" | "),a=e=>{switch(e){case"ab-essentiel":return"Essentiel";case"ab-equilibre":return"Equilibre";case"ab-impact":return"Impact";case"ab-choix":return"Personnalisé";default:return"Abonnement"}};e(p,e=>{e.preventDefault();const r=p.querySelector('input[name="plan"]:checked'),o=Number(r?.dataset.abPreset||"0")||0,i=document.getElementById("ab-amount"),c=o>0?o:Math.max(1,Number(i?.value||"0"));if(!c||Number.isNaN(c))return void v("Merci de choisir un montant (minimum 1 EUR)","error");const s=t(),l=Object.values(s).reduce((e,t)=>e+(Number(t)||0),0);if(Math.abs(l-100)>.5)return void v("La répartition doit faire 100%. Ajustez vos curseurs.","error");const d={plan:a(r?.id||""),montant:`${c.toFixed(2)} EUR / mois`,repartition:n(s),cycle:"Mensuel",alloc_puits:s.puit||0,alloc_colis:s.colis||0,alloc_arbres:s.arbre||0,alloc_orphelins:s.orphelins||0,alloc_mosquees:s.mosquee||0};S(72,1,{_unit_price:c,_override_name:"Kebchi+ (abonnement)",...d})})}})(),w(),L(),(()=>{const e=document.querySelector("[data-cart-clear]");e&&e.addEventListener("click",e=>{e.preventDefault();try{localStorage.removeItem("cart"),document.querySelectorAll("[data-cart-item]").forEach(e=>e.remove());const e=document.querySelector("[data-fees-toggle]"),t=document.querySelector("[data-fees-amount]");e&&t&&(e.checked=!1,t.dataset.feesValue="0",t.setAttribute("data-fees-value","0"),t.textContent="");const n=c();g(n),x(n),v("Panier vidé")}catch(e){console.error(e),v("Impossible de vider le panier","error")}})})(),(()=>{const e=c();g(e),document.querySelector("[data-cart-items-container]")&&x(e)})(),(()=>
1{const t=document.querySelector("[data-fees-toggle]"),l=document.querySelector("[data-fees-amount]");if(!t||!l)return;const d=Number(l.getAttribute("data-fees-base")||"0"),u=e=>{l.dataset.feesValue=e?d.toString():"0",l.textContent=e?"+ "+s(d):""};let m=n(),p=m.some(e=>73===e.product_id);m.length>0&&!p&&!r()&&(m.push({id:e(),product_id:73,name:"Frais de paiement",price:d,quantity:1,details:{}}),m=i(m),a(m),p=!0,x(c())),t.checked=p,u(p),t.addEventListener("change",()=>{let r=n();const s=r.findIndex(e=>73===e.product_id);t.checked&&-1===s&&(r.push({id:e(),product_id:73,name:"Frais de paiement",price:d,quantity:1,details:{}}),o(!1),console.log("Frais ajoutés")),t.checked||-1===s||(r.splice(s,1),o(!0),console.log("Frais supprimés")),r=i(r),a(r),console.log("Cart après:",JSON.stringify(r));const l=c();console.log("Summary:",JSON.stringify(l)),g(l),x(l),u(t.checked),typeof updateStripeAmount==="function"&&updateStripeAmount(),console.log("=== FIN TOGGLE ===")})})()};window.__cartBindings=E,E()},initFaqToggles=()=>{const e=document.querySelectorAll(".faq-item .faq-question");e.length&&e.forEach(e=>{e.addEventListener("click",()=>{const t=e.closest(".faq-item"),n=t&&t.classList.contains("active");document.querySelectorAll(".faq-item").forEach(e=>{e.classList.remove("active")}),t&&!n&&t.classList.add("active")})})},initKebchiInteractions=()=>{initLegacyMenu(),initHeroSlider(),initHeroCarouselSwiper(),initActionSections(),initReveal(),initBackToTop(),initSmoothAnchors(),initCartAjax(),initFaqToggles()};let swupInstance=null;const setupSwup=()=>{"undefined"==typeof Swup||swupInstance||(swupInstance=new Swup({containers:["#swup"],linkSelector:'a[href^="/"]:not([data-no-swup]):not([target="_blank"]):not([download])'}))};document.addEventListener("DOMContentLoaded",()=>{initKebchiInteractions(),setupSwup()}),document.addEventListener("swup:contentReplaced",()=>{initKebchiInteractions()});

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.