PageSourceSearch

https://www.lardesports.com/cdn/shop/t/2/assets/module-cordage.js?v=123751940583334090521790085940

js lardesports.com collected 2026-09-28 12:44:03 UTC 52,768 bytes, 2 lines download raw bytes

1const cordageOpeningButton=document.querySelector('[data-open-modal="cordage"]'),POSE_CORDAGE_VARIANT_ID=cordageOpeningButton?.dataset.variantId?+cordageOpeningButton.dataset.variantId:null,POSE_CORDAGE_COST=+cordageOpeningButton?.dataset.cost||0,POSE_VARIANTS=(()=>{try{return JSON.parse(cordageOpeningButton?.dataset.poseVariants||"[]")}catch{return[]}})(),POSE_TIER_SKUS={badminton:{"0-1":"910100009","1-0":"910100007","1-1":"910100008","2-0":"910100006","2-1":"910100004","3-0":"910100005","3-1":"910100003"},squash:{"0-1":"910100020","1-0":"910100019","1-1":"910100021"},tennis:{"0-1":"910100011","1-0":"910100010","1-1":"910100013","2-0":"910100012","2-1":"910100015","3-0":"910100014","3-1":"910100017","4-0":"910100016","4-1":"910100018"}};function resolvePoseVariant(sport,{hasLogo,hasBande,hasSurgrip,hasPreStretch,hasGrip}){const key=`${[hasLogo,hasBande,hasSurgrip,hasPreStretch].filter(Boolean).length}-${hasGrip?1:0}`,sku=POSE_TIER_SKUS[sport]?.[key],match=sku&&POSE_VARIANTS.find(variant=>variant.sku===sku);return match||POSE_VARIANTS.find(variant=>variant.id===POSE_CORDAGE_VARIANT_ID)||{id:POSE_CORDAGE_VARIANT_ID,price:POSE_CORDAGE_COST*100}}function poseSideLabel(poseValue){return poseValue==="Pose droitier"?"Droitier":poseValue==="Pose gaucher"?"Gaucher":"Non"}window.variantsToAdd=window.variantsToAdd||{main:null,poseProperties:null,poseFlags:null,cordage:null,cordageProperties:null,expert:null,upsells:{}};const CORDAGE_SPORT=cordageOpeningButton?.dataset.sport||"default",CORDAGE_PRODUCT_ID=document.querySelector(".cordage__container")?.dataset.productId||"default",CORDAGE_PROGRESS_KEY=`cordageProgress_${CORDAGE_SPORT}_${CORDAGE_PRODUCT_ID}`;function loadCordageProgress(){try{return JSON.parse(localStorage.getItem(CORDAGE_PROGRESS_KEY))||null}catch{return null}}function saveCordageProgress(progress){try{localStorage.setItem(CORDAGE_PROGRESS_KEY,JSON.stringify(progress))}catch{}}function clearCordageProgress(){try{localStorage.removeItem(CORDAGE_PROGRESS_KEY)}catch{}window.cordageProgress={step:1,screen:"home",qty:1,cordageInfos:null,cordageOptions:null,qcmResults:null,upsells:{},collection:null}}function updateCordageProgress(patch){Object.assign(window.cordageProgress,patch),window.cordageProgress.variantsToAdd={cordage:window.variantsToAdd.cordage,cordageProperties:window.variantsToAdd.cordageProperties,poseProperties:window.variantsToAdd.poseProperties,poseFlags:window.variantsToAdd.poseFlags,expert:window.variantsToAdd.expert,upsells:window.variantsToAdd.upsells},saveCordageProgress(window.cordageProgress)}window.cordageProgress=window.cordageProgress||loadCordageProgress()||{step:1,screen:"home",qty:1,cordageInfos:null,cordageOptions:null,qcmResults:null,upsells:{}},window.cordageProgress.variantsToAdd&&Object.assign(window.variantsToAdd,window.cordageProgress.variantsToAdd);class CordageModal extends HTMLElement{constructor(){super(),this.openingButtons=document.querySelectorAll('[data-open-modal="cordage"]'),this.openingButtons.forEach(btn=>{btn.addEventListener("click",()=>this.open())}),this.overlay=this.querySelector(".cordage__overlay"),this.closeButton=this.querySelector(".cordage__close"),this.overlay.addEventListener("click",()=>this.handleCloseProcess()),this.closeButton.addEventListener("click",()=>this.handleCloseProcess()),this._onKeyDown=e=>e.key==="Escape"&&this.handleCloseProcess(),document.addEventListener("keydown",this._onKeyDown),this.updatePoseCost()}updatePoseCost(){const baseLabel=this.querySelector(".cordage__recap--base [data-amount-to-update]");baseLabel&&(baseLabel.dataset.amount=POSE_CORDAGE_COST,baseLabel.textContent=POSE_CORDAGE_COST.toFixed(2)),this.querySelectorAll(".cordage__recap--total-amount [data-amount-to-update]").forEach(span=>{const total=+span.dataset.amount+POSE_CORDAGE_COST;span.dataset.amount=total,span.textContent=total.toFixed(2)})}open(){this.setAttribute("aria-expanded","true"),this.classList.add("open"),document.documentElement.style.overflow="hidden"}handleCloseProcess(){if(window.cordageProgress.cordageInfos===null){this.close();return}const confirmationPanel=this.querySelector(".cordage__close-confirmation");if(!confirmationPanel){this.close();return}confirmationPanel.classList.add("active");const confirm=confirmationPanel.querySelector(".cordage__close-confirmed"),cancel=confirmationPanel.querySelector(".cordage__close-cancelled");confirm.addEventListener("click",()=>{confirmationPanel.classList.remove("active"),this.close()}),cancel.addEventListener("click",()=>confirmationPanel.classList.remove("active"))}
1close(){this.setAttribute("aria-expanded","false"),this.classList.remove("open"),document.documentElement.style.overflow="";const container=this.querySelector(".cordage__container");container&&container.dispatchEvent(new Event("cordage:reset"),{once:!0})}}customElements.define("cordage-modal",CordageModal);class CordageHeader extends HTMLElement{constructor(){super(),this.container=this.closest(".cordage__container"),this.step=+this.dataset.step,this.currentScreen="home",this.qcmVisited=!1}connectedCallback(){this.listenToEvents()}listenToEvents(){this.container.addEventListener("cordage:step",e=>this.handleDirectStep(e.detail)),this.container.addEventListener("cordage:direction",e=>this.handleDirection(e.detail.direction)),this.container.addEventListener("cordage:reset",()=>this.handleReset()),this.container.addEventListener("cordage:collection",()=>this.handleCollection()),this.container.addEventListener("cordage:screen",e=>{this.currentScreen=e.detail.screen,e.detail.screen==="qcm-results"&&(this.qcmVisited=!0)}),this.container.addEventListener("cordage:qcm-results",()=>{this.currentScreen="qcm-results",this.qcmVisited=!0})}handleDirectStep(detail){const{step,loadEvents}=detail;this.step=step,this.dataset.step=step,updateCordageProgress({step}),loadEvents&&this.dispatchCustomEvents(step)}handleDirection(direction){if(direction!=="next"&&this.currentScreen==="qcm-results"){this.container.dispatchEvent(new CustomEvent("cordage:screen",{detail:{screen:"qcm"}}));return}let newStep;if(direction==="next"?newStep=this.step+1:newStep=this.step-1,!(newStep>5)){if(newStep<1){this.container.dispatchEvent(new Event("cordage:reset"),{once:!0});return}if(direction!=="next"&&newStep===1&&this.qcmVisited){this.container.dispatchEvent(new CustomEvent("cordage:screen",{detail:{screen:"qcm-results"}})),this.step=newStep,this.dataset.step=this.step,updateCordageProgress({step:this.step});return}this.dispatchCustomEvents(newStep),this.step=newStep,this.dataset.step=this.step,updateCordageProgress({step:this.step})}}dispatchCustomEvents(step){step===1&&this.container.dispatchEvent(new Event("cordage:reset"),{once:!0}),step===2&&this.container.dispatchEvent(new CustomEvent("cordage:screen",{detail:{screen:"options"}}),{once:!0}),step===3&&(this.container.dispatchEvent(new Event("cordage:save-cordage-options"),{once:!0}),this.container.querySelector("cordage-footer")?.enabledNextButton()),(step===3||step===5)&&this.container.dispatchEvent(new CustomEvent("cordage:screen",{detail:{screen:"upsells"}}),{once:!0})}handleReset(){this.step=1,this.dataset.step=this.step,this.qcmVisited=!1,this.container.dispatchEvent(new CustomEvent("cordage:screen",{detail:{screen:"home"}}))}handleCollection(){this.step===3&&this.handleDirection("next"),this.container.dispatchEvent(new CustomEvent("cordage:screen",{detail:{screen:"collection"}}))}}customElements.define("cordage-header",CordageHeader);class CordageBody extends HTMLElement{constructor(){super(),this.container=this.closest(".cordage__container"),this.currentScreen=this.dataset.currentScreen||"home",this.nextStepButtons=this.querySelectorAll("[data-next-step]")}connectedCallback(){this.init()}init(){this.handleHomeButtons(),this.handleTargetButtons(),this.handleAddCordageButtons(),this.handleRangeInputs(),this.listenToEvents(),this.handleCollectionsOpener(),this.handleNextStepButtons(),this.bindCordageFacets(),this.handleCordageCollection(),this.handleUpsellsCollection(),this.handleMainVariant(),this.handleQcmQuestions()}listenToEvents(){this.container.addEventListener("cordage:selected",e=>this.handleSelectedCordage(e.detail.productInfos)),this.container.addEventListener("cordage:screen",e=>this.setScreen(e.detail.screen)),this.container.addEventListener("cordage:qcm-results",e=>this.setScreen("qcm-results")),this.container.addEventListener("cordage:save-cordage-options",()=>this.saveCordageOptions()),this.container.addEventListener("cordage:collection",e=>this.renderCollection(e.detail)),this.container.addEventListener("cordage:reset",()=>{this.resetUpsellButtons(),this.resetExpertInput(),clearCordageProgress()})}handleMainVariant(){const mainVariantInput=document.querySelector('form[data-type="add-to-cart-form"] [name="id"]');mainVariantInput&&this.setLinkedMainProducts(mainVariantInput.value),window.theme?.pubsub&&window.theme.pubsub.subscribe(window.theme.pubsub.PUB_SUB_EVENTS.variantChange,payload=>{const variant=payload?.data?.variant;variant&&this.setLinkedMainProducts(variant.id)})}setLinkedMainProducts(mainVariantId){window.variantsToAdd.main={id:mainVariantId,quantity:window.variantsToAdd.main?.quantity||1}}resetUpsellButtons(){this.querySelectorAll(".cordage__upsell")?.forEach(wrapper=>{wrapper.querySelector(".cordage__upsell--added")?.remove(),delete wrapper.dataset.addedCost;const button=wrapper.querySelector("[data-collection-handle]");button&&(button.hidden=!1)}),window.variantsToAdd.cordage=null,window.variantsToAdd.cordageProperties=null,window.variantsToAdd.poseProperties=null,window.variantsToAdd.poseFlags=null,window.variantsToAdd.expert=null,window.variantsToAdd.upsells={}}resetExpertInput(){const expertNo=this.querySelector("input#expert-no");expertNo&&(expertNo.checked=!0,expertNo.dispatchEvent(new Event("input",{bubbles:!0})))}setScreen(screen){this.currentScreen=screen,this.dataset.currentScreen=screen,updateCordageProgress({screen}),screen==="qcm-results"&&this.populateQcmResults(),screen==="qcm"&&(this.qcmInputsAllChecked()?this.container.dis
1patchEvent(new Event("cordage:qcm-ready")):this.container.querySelector("cordage-footer")?.disabledNextButton())}qcmInputsAllChecked(){const questions=this.querySelectorAll(".cordage__question"),checkedInputs=this.querySelectorAll(".cordage__questions input:checked, .cordage__questions input[checked]");return questions.length>0&&checkedInputs.length===questions.length}handleHomeButtons(){this.querySelectorAll('[data-screen="home"] .button.modal-opener')?.forEach(btn=>{btn.addEventListener("click",()=>{const modal=this.querySelector(`#${btn.dataset.openModal}`);if(!modal)return;modal.classList.add("active"),modal.querySelectorAll(".button").forEach(btn2=>{btn2.addEventListener("click",()=>modal.classList.remove("active")),btn2.getAttribute("data-close-modal")!=null&&modal.querySelectorAll(".cordage__variants input")?.forEach(el=>el.checked=!1)});const confirmButton=modal.querySelector(".button--confirmed");confirmButton&&(confirmButton.setAttribute("disabled","true"),modal.querySelectorAll(".cordage__variants input")?.forEach(input=>input.addEventListener("input",()=>{confirmButton.removeAttribute("disabled")},{once:!0})))})})}handleTargetButtons(){this.container.querySelectorAll("[data-screen-target]")?.forEach(btn=>{btn.addEventListener("click",()=>{this.container.dispatchEvent(new CustomEvent("cordage:screen",{detail:{screen:btn.dataset.screenTarget}})),btn.dataset.screenTarget==="options"&&(this.container.dispatchEvent(new CustomEvent("cordage:step",{detail:{step:2,loadEvents:!1}})),this.container.querySelector("cordage-footer")?.enabledNextButton())})})}handleNextStepButtons(){this.nextStepButtons?.forEach(btn=>{btn.addEventListener("click",()=>{this.container.dispatchEvent(new CustomEvent("cordage:direction",{detail:{direction:"next"}}))})})}handleAddCordageButtons(){this.querySelectorAll("[data-product-cordage]")?.forEach(selector=>{selector.addEventListener("click",()=>{const infos=JSON.parse(selector.dataset.productCordage),variant=selector.closest(".cordage__body--modal")?.querySelector(".cordage__variants input:checked")||selector.closest(".cordage__body--modal")?.querySelector(".cordage__variants input[checked]"),variantId=variant?.value,variantTitle=variant?.dataset.variantTitle;infos.variantId=variantId,infos.variantTitle=variantTitle,this.container.dispatchEvent(new CustomEvent("cordage:selected",{detail:{productInfos:infos}}))})})}handleSelectedCordage(infos){this.cordageInfos=infos;const bobineLabel=(this.container.dataset.bobineLabel||"").toLowerCase(),isBobine=bobineLabel!==""&&!!infos.title?.toLowerCase().includes(bobineLabel);window.variantsToAdd.cordage={id:infos.variantId,quantity:1,isBobine},updateCordageProgress({cordageInfos:infos})}handleRangeInputs(){const ranges=this.querySelectorAll('.screen__input--range input[type="range"]'),updateRange=range=>{const min=+range.min||0,max=+range.max||100,percent=(range.value-min)/(max-min)*100,output=this.querySelector(`output[for="${range.id}"]`);range.style.setProperty("--range-progress",`${percent}%`),output&&(output.textContent=range.value)};ranges?.forEach(range=>{range.addEventListener("input",()=>updateRange(range)),updateRange(range)}),ranges?.forEach(range=>{const masterId=range.dataset.rangeDependent;if(!masterId)return;const master=this.querySelector(`#${masterId}`);if(!master)return;const diff=+range.dataset.rangeDiff||0,absMin=+master.min,absMax=+master.max,syncWithMaster=()=>{const masterValue=+master.value;range.min=Math.max(absMin,masterValue-diff),range.max=Math.min(absMax,masterValue+diff),range.value=master.value,updateRange(range)};master.addEventListener("input",syncWithMaster),syncWithMaster()})}saveCordageOptions(){const getValueFromInput=(selector,checkAdditionalCost=!1)=>checkAdditionalCost?{value:this.querySelector(selector)?.value,cost:+this.querySelector(selector)?.dataset.additionalCost||0}:this.querySelector(selector)?.value;this.cordageOptions={logo:getValueFromInput('input[name="logo"]:checked',!0),protection:getValueFromInput('input[name="bande-protection"]:checked',!0)},!!this.querySelector("input#expert-yes:checked")?this.cordageOptions.expertVariantId=56325529731412:(this.cordageOptions.expertVariantId=null,this.cordageOptions.montant=getValueFromInput("input#cordage-montant"),this.cordageOptions.travers=getValueFromInput("input#cordage-travers"),this.cordageOptions.noeuds=getValueFromInput('input[name="noeuds"]:checked',!0),this.cordageOptions.preStretch=getValueFromInput('input[name="preStretch"]:checked',!0)),this.container.dis
1patchEvent(new CustomEvent("cordage:options",{detail:{options:this.cordageOptions}})),window.variantsToAdd.expert=this.cordageOptions.expertVariantId?{id:this.cordageOptions.expertVariantId,quantity:1}:null,window.variantsToAdd.cordageProperties=this.buildCordageProperties(this.cordageOptions);const poseInfo=this.buildPoseProperties(this.cordageOptions);window.variantsToAdd.poseProperties=poseInfo.properties,window.variantsToAdd.poseFlags={hasLogo:poseInfo.hasLogo,hasBande:poseInfo.hasBande,hasPreStretch:poseInfo.hasPreStretch},updateCordageProgress({cordageOptions:this.cordageOptions})}buildCordageProperties(options){const properties={};let additionalCost=0;return options.expertVariantId?properties.R\u00E9glage="R\xE9glage expert Lardesports":(properties.Montant=options.montant,properties.Travers=options.travers,properties.Noeuds=options.noeuds?.value,additionalCost+=options.noeuds?.cost||0),properties._additional_cost=additionalCost,properties}buildPoseProperties(options){const hasLogo=options.logo?.value==="Oui",hasBande=options.protection?.value==="Oui",hasPreStretch=options.preStretch?.value==="Oui",properties={};return options.logo?.value!==void 0&&(properties["Pose logo"]=hasLogo?"Oui (+ 3\u20AC)":"Non"),options.protection?.value!==void 0&&(properties["Bande de protection"]=hasBande?"Oui (+ 3\u20AC)":"Non"),options.preStretch?.value!==void 0&&(properties["Pr\xE9-stretch"]=hasPreStretch?"Oui":"Non"),{properties,hasLogo,hasBande,hasPreStretch}}handleCollectionsOpener(){this.container.querySelectorAll("[data-collection-handle]")?.forEach(btn=>{btn.addEventListener("click",()=>{btn.dataset.source==="upsells"&&(this.currentUpsellHandle=btn.dataset.collectionHandle),this.container.dispatchEvent(new CustomEvent("cordage:collection",{detail:{handle:btn.dataset.collectionHandle,source:btn.dataset.source}}))})})}async renderCollection(infos){const{handle,source}=infos;if(!handle||!source)return;updateCordageProgress({collection:{handle,source}});const wrapper=this.querySelector('[data-screen="collection"]'),url=`/collections/${handle}?section_id=cordage-collection-${source}&filter.v.availability=1`;wrapper&&(wrapper.innerHTML="",await this.fetchCollectionSection(wrapper,url,source))}async fetchCollectionSection(wrapper,url,source){try{const response=await fetch(url);if(!response.ok)throw new Error(`Erreur HTTP: ${response.status}`);const htmlText=await response.text();wrapper.innerHTML=htmlText,this.sortUpsellsByBrand(wrapper)}catch(error){console.error("Erreur lors du Section Rendering :",error)}}sortUpsellsByBrand(wrapper){const brand=this.container?.dataset.brand;if(!brand)return;const grid=wrapper.querySelector("[data-cordage-product-grid]");if(!grid)return;const emptyState=grid.querySelector("[data-cordage-search-empty]");[...grid.querySelectorAll(".cordage__collection--card[data-vendor]")].sort((a,b)=>(a.dataset.vendor===brand?0:1)-(b.dataset.vendor===brand?0:1)).forEach(card=>grid.insertBefore(card,emptyState))}bindCordageFacets(){const wrapper=this.querySelector('[data-screen="collection"]');wrapper&&(wrapper.addEventListener("click",e=>{const toggleButton=e.target.closest("[data-collection-filters]");if(toggleButton){this.toggleCordageFacetsPanel(wrapper,toggleButton);return}if(e.target.closest("[data-cordage-facet-close]")){this.toggleCordageFacetsPanel(wrapper,null,!1);return}const link=e.target.closest("[data-cordage-facet-remove], [data-cordage-facet-clear]");link&&(e.preventDefault(),this.fetchCordageFacetUrl(wrapper,link.href))}),wrapper.addEventListener("submit",e=>{const form=e.target.closest("[data-cordage-facet-form]");form&&(e.preventDefault(),this.toggleCordageFacetsPanel(wrapper,null,!1),this.submitCordageFacets(wrapper,form))}),wrapper.addEventListener("change",e=>{const form=e.target.closest("[data-cordage-facet-form]");form&&(e.target.closest(".details__content--price-range")||(this.toggleCordageFacetsPanel(wrapper,null,!1),this.submitCordageFacets(wrapper,form)))}),wrapper.addEventListener("focusout",e=>{const priceRange=e.target.closest(".details__content--price-range");if(!priceRange)return;const form=e.target.closest("[data-cordage-facet-form]");form&&setTimeout(()=>{priceRange.contains(document.activeElement)||(this.toggleCordageFacetsPanel(wrapper,null,!1),this.submitCordageFacets(wrapper,form))},0)}))}toggleCordageFacetsPanel(wrapper,toggleButton,forceOpen){const panel=wrapper.querySelector("[data-cordage-facet-panel]");if(!panel)return;const button=toggleButton||wrapper.querySelector("[data-collection-filters]"),shouldOpen=forceOpen!==void 0?forceOpen:panel.hidden;panel.hidden=!shouldOpen,button?.setAttribute("aria-expanded",String(shouldOpen)),this.cordageFacetsOpen=shouldOpen}submitCordageFacets(wrapper,form){const url=new URL(form.action),params=new URLSearchParams(new FormData(form));
1url.search="",params.forEach((value,key)=>{value!==""&&url.searchParams.append(key,value)}),this.fetchCordageFacetUrl(wrapper,url.toString())}fetchCordageFacetUrl(wrapper,href){const source=wrapper.querySelector("[data-source]")?.dataset.source,url=new URL(href);url.searchParams.set("section_id",`cordage-collection-${source}`),url.searchParams.set("filter.v.availability","1"),this.fetchCollectionSection(wrapper,url.toString())}handleCordageCollection(){this.addEventListener("click",e=>{const card=e.target.classList.contains("cordage__collection--card--home")?e.target:null;if(card)if(card.classList.contains("active"))card.classList.remove("active"),this.container.dispatchEvent(new Event("cordage:not-ready"));else{this.querySelectorAll(".cordage__collection--card.active")?.forEach(activeCard=>activeCard.classList.remove("active")),card.classList.add("active");let variantId,variantTitle;const data=JSON.parse(card.querySelector("script").textContent);+card.dataset.variantsCount>1?card.querySelectorAll(".cordage__variants input").forEach(input=>{input.addEventListener("input",()=>{input.checked&&(variantId=input.value,variantTitle=input.dataset.variantTitle,data.variantId=variantId,data.variantTitle=variantTitle,this.container.dispatchEvent(new CustomEvent("cordage:ready",{detail:{infos:data}})))})}):(variantId=card.querySelector(".tag--variant")?.dataset.variantId,variantTitle=card.querySelector(".tag--variant")?.dataset.variantTitle,data.variantId=variantId,data.variantTitle=variantTitle,this.container.dispatchEvent(new CustomEvent("cordage:ready",{detail:{infos:data}})))}})}handleUpsellsCollection(){this.upsellModal=this.querySelector("#cordageUpsellModal"),this.upsellModal&&(this.addEventListener("click",e=>{const card=e.target.closest('.cordage__collection--card[data-source="upsells"]');if(!card)return;const dataScript=card.querySelector("script[data-upsell-product]");dataScript&&this.openUpsellModal(JSON.parse(dataScript.textContent))}),this.bindUpsellModal())}openUpsellModal(product){this.currentUpsellProduct=product;const colors=product.colorVariants?.length?product.colorVariants:[product];this.renderUpsellSwatches(colors),this.selectUpsellColor(colors[0]),this.currentUpsellHasNoPose=this.currentUpsellHandle?.startsWith("antivibrateurs-de-"),this.resetUpsellPose(),this.container.addEventListener("cordage:direction",e=>e.detail.direction==="prev"&&this.closeUpsellModal(),{once:!0}),this.upsellModal.classList.add("active")}closeUpsellModal(){this.upsellModal.classList.remove("active")}renderUpsellSwatches(colors){const wrapper=this.upsellModal.querySelector("[data-upsell-swatches]");wrapper.innerHTML="",colors.forEach((color,index)=>{const swatch=document.createElement("button");swatch.type="button",swatch.className="modal__upsell--swatch",swatch.classList.toggle("active",index===0);const img=document.createElement("img");img.src=color.image,img.alt=color.color||color.title,img.width=64,img.height=64,swatch.appendChild(img),swatch.addEventListener("click",()=>{wrapper.querySelectorAll(".modal__upsell--swatch").forEach(el=>el.classList.remove("active")),swatch.classList.add("active"),this.selectUpsellColor(color)}),wrapper.appendChild(swatch)})}selectUpsellColor(color){this.selectedUpsellColor=color;const label=this.upsellModal.querySelector("[data-upsell-color-name]");label&&(label.textContent=color.color||color.title||"")}resetUpsellPose(){const isGrip=this.currentUpsellHandle?.startsWith("grips-de-");this.upsellModal.querySelectorAll('input[name="upsell-pose"]').forEach(input=>{input.checked=!1}),this.upsellModal.querySelectorAll("[data-pose-label-grip]").forEach(el=>el.hidden=!isGrip),this.upsellModal.querySelectorAll("[data-pose-label-surgrip]").forEach(el=>el.hidden=isGrip),this.upsellModal.querySelector("[data-upsell-pose-error]").hidden=!0,this.upsellModal.querySelector("[data-upsell-pose-header]").hidden=this.currentUpsellHasNoPose,this.upsellModal.querySelector("[data-upsell-pose-group]").hidden=this.currentUpsellHasNoPose;const confirmButton=this.upsellModal.querySelector("[data-upsell-confirm]");this.currentUpsellHasNoPose?confirmButton.removeAttribute("disabled"):confirmButton.setAttribute("disabled","true")}bindUpsellModal(){this.upsellModal.querySelectorAll('input[name="upsell-pose"]').forEach(input=>{input.addEventListener("change",()=>{this.upsellModal.querySelector("[data-upsell-pose-error]").hidden=!0,this.upsellModal.querySelector("[data-upsell-confirm]").removeAttribute("disabled")})}),this.upsellModal.querySelector("[data-upsell-prev]").addEventListener("click",()=>this.closeUpsellModal()),this.upsellModal.querySelector("[data-upsell-confirm]").addEventListener("click",()=>{let pose={value:"Aucune"};if(!this.currentUpsellHasNoPose){const checkedPose=this.upsellModal.querySelector('input[name="upsell-pose"]:checked');if(!checkedPose){this.upsellModal.querySelector("[data-upsell-pose-error]").hidden=!1;return}pose={value:checkedPose.value}}const selection={product:this.currentUpsellProduct,color:this.selectedUpsellColor,pose};
1this.container.dispatchEvent(new CustomEvent("cordage:x-sell",{detail:{...selection,handle:this.currentUpsellHandle}})),this.applyUpsellSelection(this.currentUpsellHandle,selection),this.closeUpsellModal(),this.container.dispatchEvent(new CustomEvent("cordage:screen",{detail:{screen:"upsells"}})),this.container.dispatchEvent(new CustomEvent("cordage:step",{detail:{step:3,loadEvents:!0}}))})}applyUpsellSelection(handle,selection){if(!handle)return;const buttons=this.container.querySelectorAll(`.cordage__upsell [data-collection-handle="${handle}"]`);buttons?.forEach(button=>{const wrapper=button?.closest(".cordage__upsell"),template=wrapper?.querySelector("template");if(!wrapper||!template)return;wrapper.querySelector(".cordage__upsell--added")?.remove();const clone=template.content.cloneNode(!0),img=clone.querySelector("img");img.src=selection.color.image,img.alt=selection.color.title,clone.querySelector(".title").textContent=selection.color.title,clone.querySelector(".color").textContent=selection.color.color?`Couleur : ${selection.color.color}`:"",clone.querySelector(".pose").textContent=selection.pose.value!=="Aucune"?selection.pose.value:"";const price=+selection.color.price,comparePrice=+selection.color.comparePrice;clone.querySelector(".price").textContent=`${price.toFixed(2)}\u20AC`;const compareEl=clone.querySelector(".compare"),tagEl=clone.querySelector(".tag");comparePrice>price&&selection.color.percentage>0?(compareEl.textContent=`${comparePrice.toFixed(2)}\u20AC`,tagEl.textContent=`-${selection.color.percentage}%`):(compareEl.remove(),tagEl.remove()),wrapper.dataset.addedCost=price,window.variantsToAdd.upsells[handle]={id:selection.color.variantId,pose:selection.pose.value!=="Aucune"?selection.pose.value:null,title:selection.color.title,image:selection.color.image},updateCordageProgress({upsells:{...window.cordageProgress.upsells,[handle]:selection}}),clone.querySelector("[data-upsell-remove]").addEventListener("click",()=>{this.removeUpsellSelection(wrapper,buttons,handle)}),button.hidden=!0,wrapper.appendChild(clone)})}removeUpsellSelection(wrapper,buttons,handle){const cost=+wrapper.dataset.addedCost||0;buttons.forEach(button=>button.closest(".cordage__upsell").querySelector(".cordage__upsell--added")?.remove()),delete wrapper.dataset.addedCost,buttons.forEach(button=>button.hidden=!1),delete window.variantsToAdd.upsells[handle];const progressUpsells={...window.cordageProgress.upsells};delete progressUpsells[handle],updateCordageProgress({upsells:progressUpsells}),this.container.dispatchEvent(new CustomEvent("cordage:x-sell-removed",{detail:{cost,handle}}))}handleQcmQuestions(){const inputs=this.querySelectorAll(".cordage__questions input");if(!inputs)return;this.results={};const inputVisualWeight=this.querySelector('.cordage__questions input[name="visual_weight"]');inputVisualWeight&&(this.results[inputVisualWeight.name]=inputVisualWeight.value);const inputWeight=this.querySelector(".cordage__questions .sr-only input:checked")||this.querySelector(".cordage__questions .sr-only input[checked]");inputWeight&&(this.results[inputWeight.name]=inputWeight.value),inputs.forEach(input=>input.addEventListener("input",()=>{this.results[input.name]=input.value,this.results[`${input.name}_wording`]=input.dataset.wording||input.value,updateCordageProgress({qcmResults:this.results}),console.log(this.results),this.qcmInputsAllChecked()&&this.container.dispatchEvent(new Event("cordage:qcm-ready"))}))}populateQcmResults(){this.container.dispatchEvent(new CustomEvent("cordage:step",{detail:{step:1,loadEvents:!1}})),this.container.querySelector("cordage-footer")?.disabledNextButton();const text=this.querySelector('[data-screen="qcm-results"] .screen__header--title'),items=["age","visual_weight","hit","upgrade"];if(!text)return;items.forEach(item=>{const toReplace=text.querySelector(`.${item}`);toReplace&&(toReplace.textContent=this.results[`${item}_wording`]??this.results[item])});const data=JSON.parse(this.querySelector('script[type="application/json"]#helper').textContent);if(!data)return;const textResults=`${this.results.weight?this.results.weight:""}${this.results.age}${this.results.hit}${this.results.pain?this.results.pain:""}${this.results.upgrade}`,relatedProductsHandles=data[textResults],productsGrid=this.querySelector(".qcm-results__grid");productsGrid&&(this.renderQcmResultsProducts(relatedProductsHandles,productsGrid),this.container.addEventListener("cordage:selected",()=>
1{this.container.dispatchEvent(new CustomEvent("cordage:step",{detail:{step:2,loadEvents:!0}})),this.container.querySelector("cordage-footer")?.enabledNextButton()},{once:!0}))}async renderQcmResultsProducts(handles,grid){if(!handles?.length)return;const cards=await Promise.all(handles.map(handle=>this.fetchQcmProductCard(handle)));grid.innerHTML="",cards.forEach(html=>html&&grid.insertAdjacentHTML("beforeend",html))}async fetchQcmProductCard(handle){try{const response=await fetch(`/products/${handle}?sections=cordage-product-card`);if(!response.ok)throw new Error(`Erreur HTTP: ${response.status}`);return(await response.json())["cordage-product-card"]}catch(error){return console.error("Erreur lors du Section Rendering :",error),null}}}customElements.define("cordage-body",CordageBody);class CordageFooter extends HTMLElement{constructor(){super(),this.container=this.closest(".cordage__container"),this.buttons=this.querySelectorAll("button"),this.buttons.forEach(btn=>btn.addEventListener("click",()=>this.handleDirection(btn
1))),this.nextButton=this.querySelector('button[data-direction="next"]'),this.addToCartButton=this.querySelector("[data-add-to-cart]"),this.addToCartButton?.addEventListener("click",()=>this.handleAddToCart()),this.toggleRecapMobile=this.container.querySelectorAll("[data-toggle-recap]"),this.toggleRecapMobile?.forEach(btn=>btn.addEventListener("click",()=>this.handleRecapOpening()))}connectedCallback(){this.init()}init(){this.listenToEvents()}listenToEvents(){this.container.addEventListener("cordage:collection",()=>this.disabledNextButton()),this.container.addEventListener("cordage:not-ready",()=>this.disabledNextButton()),this.container.addEventListener("cordage:reset",()=>this.enabledNextButton()),this.container.addEventListener("cordage:qcm-ready",e=>{this.enabledNextButton(),this.dispatchOnNextButton("cordage:qcm-results")}),this.container.addEventListener("cordage:ready",e=>{this.enabledNextButton(),this.dispatchOnNextButton("cordage:selected",{productInfos:e.detail.infos})})}handleDirection(btn){const{direction}=btn.dataset;direction&&this.container.dispatchEvent(new CustomEvent("cordage:direction",{detail:{direction}}))}enabledNextButton(){this.nextButton?.removeAttribute("disabled")}disabledNextButton(){this.nextButton?.setAttribute("disabled","true")}dispatchOnNextButton(event,detail){this.nextButton?.addEventListener("click",()=>{this.container.dispatchEvent(new CustomEvent(event,{detail}))},{once:!0})}buildAssociateKey({mainId,poseVariantId,cordageId,cordageProperties,expertId,upsells}){const parts=[`main:${mainId||""}`,`pose:${poseVariantId||""}`,`cordage:${cordageId||""}:${JSON.stringify(cordageProperties||{})}`,`expert:${expertId||""}`];return Object.keys(upsells||{}).sort().forEach(handle=>{const upsell=upsells[handle];parts.push(`upsell:${handle}:${upsell?.id||""}:${upsell?.pose||""}`)}),`assoc-${this.hashString(parts.join("|"))}`}hashString(str){let hash=5381;for(let i=0;i<str.length;i++)hash=hash*33^str.charCodeAt(i);return(hash>>>0).toString(36)}buildCartItems(){const qty=+this.container.querySelector("#cordageQty")?.value||1,data=window.variantsToAdd||{},items=[],poseFlags=data.poseFlags||{hasLogo:!1,hasBande:!1,hasPreStretch:!1},gripEntry=Object.entries(data.upsells||{}).find(([handle])=>handle.startsWith("grips-de-")),surgripEntry=Object.entries(data.upsells||{}).find(([handle])=>handle.startsWith("surgrips-de-")),gripSide=gripEntry?poseSideLabel(gripEntry[1].pose):"Non",surgripSide=surgripEntry?poseSideLabel(surgripEntry[1].pose):"Non",poseVariant=resolvePoseVariant(CORDAGE_SPORT,{hasLogo:poseFlags.hasLogo,hasBande:poseFlags.hasBande,hasPreStretch:poseFlags.hasPreStretch,hasSurgrip:surgripSide!=="Non",hasGrip:gripSide!=="Non"}),associateKey=data.main?.id?this.buildAssociateKey({mainId:data.main.id,poseVariantId:poseVariant?.id,cordageId:data.cordage?.id,cordageProperties:data.cordageProperties,expertId:data.expert?.id,upsells:data.upsells}):null,associateProperties=associateKey?{_associate_key:associateKey,_associate_variant_id:data.main.id}:{},poseProperties={...data.poseProperties};return gripEntry&&(poseProperties.Grip=gripSide!=="Non"?`${gripSide} (+ 5\u20AC)`:gripSide),surgripEntry&&(poseProperties.Surgrip=surgripSide!=="Non"?`${surgripSide} (+ 3\u20AC)`:surgripSide),data.main?.id&&items.push({id:data.main.id,quantity:qty,properties:{_cordage:poseVariant?.id||null}}),poseVariant?.id&&items.push({id:poseVariant.id,quantity:qty,parent_id:data.main?.id,properties:{...poseProperties,...associateProperties}}),data.cordage?.id&&items.push({id:data.cordage.id,quantity:data.cordage.isBobine?1:qty,parent_id:data.main?.id,properties:{...data.cordageProperties,...associateProperties}}),data.expert?.id&&items.push({id:data.expert.id,quantity:qty,parent_id:data.main?.id,properties:{...associateProperties}}),Object.entries(data.upsells||{}).forEach(([handle,upsell])=>{if(!upsell?.id)return;let type;handle.startsWith("grips-de-")?type="Grip":handle.startsWith("surgrips-de-")?type="Surgrip":handle.startsWith("antivibrateurs-de-")&&(type="Antivibrateur"),items.push({id:upsell.id,quantity:qty,properties:{...type?{_type:type}:{},...upsell.pose?{Pose:upsell.pose}:{},_cordage_x_sell:data.main?.id||void 0,...associateProperties}})}),items}async handleAddToCart(){if(!this.addToCartButton||this.addToCartButton.hasAttribute("aria-disabled"))return;const items=this.buildCartItems();if(!items.length)return;this.addToCartButton.setAttribute("aria-disabled","true"),this.addToCartButton.setAttribute("aria-busy","true");const sectionsToBundle=[];document.documentElement.dispatchEvent(new CustomEvent("cart:bundled-sections",{bubbles:!0,detail:{sections:sectionsToBundle}}));try{const parsedState=await(await fetch(window.theme.routes.cart_add_url,{...window.theme.utils.fetchConfig("javascript"),body:JSON.stringify({items,sections:sectionsToBundle,sections_url:window.location.pathname})})).json();if(parsedState.status){const message=parsedState.description||parsedState.message||"Une erreur est survenue, veuillez r\xE9essayer.";console.error(message),this.showAddToCartError(message);return}const cartJson=await(await fetch(window.theme.routes.cart_url,window.theme.utils.fetchConfig("json","GET"))).json();cartJson.sections=parsedState.sections,window.theme.pubsub.publish(window.theme.pubsub.PUB_SUB_EVENTS.cartUpdate,{source:"cordage",cart:cartJson}),document.querySelector("cart-drawer")?.show(this.container),this.closest("cordage-modal")?.close(),this.container.dis
1patchEvent(new Event("cordage:reset"))}catch(error){console.error(error),this.showAddToCartError("Une erreur est survenue, veuillez r\xE9essayer.")}finally{this.addToCartButton.removeAttribute("aria-disabled"),this.addToCartButton.removeAttribute("aria-busy")}}showAddToCartError(message){const modal=this.closest(".cordage__container");if(!modal)return;this.errorToastTimeout&&(clearTimeout(this.errorToastTimeout),this.errorToastTimeout=null);let toast=modal.querySelector(".cordage__error-toast");toast||(toast=document.createElement("div"),toast.className="cordage__error-toast",modal.appendChild(toast)),toast.textContent=message,toast.classList.add("active"),this.errorToastTimeout=setTimeout(()=>{toast.classList.remove("active"),this.errorToastTimeout=null},5e3)}handleRecapOpening(){const recap=this.container.querySelector(".cordage__recap");recap&&recap.classList.toggle("active")}}customElements.define("cordage-footer",CordageFooter);class CordageRecap extends HTMLElement{constructor(){super(),this.container=this.closest(".cordage__container"),this.qty=this.querySelector(".cordage__recap--qty"),this.qtyFactor=1,this.totalUpsellsCost=0,this.cordageCost=0,this.cordageIsBobine=!1,this.racquetPriceInfo=this.querySelector("[data-racquet-base-price]"),this.racquetUnitPriceEl=this.querySelector("[data-racquet-unit-price]"),this.racquetBulkDisplay=this.querySelector("[data-racquet-bulk-display]"),this.baseOptionsCost=0,this.poseTierDelta=0,this.hasLogo=!1,this.hasBande=!1,this.hasPreStretch=!1,this.hasGrip=!1,this.hasSurgrip=!1}connectedCallback(){this.init()}init(){this.handleActiveRecapSteps(),this.handleQtySelector(),this.listenToEvent("cordage:selected",e=>this.handleSelectedCordage(e.detail.productInfos)),this.listenToEvent("cordage:reset",()=>this.removeRecapInfos()),this.listenToEvent("cordage:options",e=>{this.storeOptions(e.detail.options),this.storeSupplementaryOptions(e.detail.options),this.recalcPoseTierDelta(),this.updateTotalOptionsCost()}),this.listenToEvent("cordage:x-sell",e=>{const cost=+e.detail.color.price;this.totalUpsellsCost=(this.totalUpsellsCost||0)+cost,this.updateUpsellsTotal(),this.updatePoseFlag(e.detail.handle,e.detail.pose?.value)}),this.listenToEvent("cordage:x-sell-removed",e=>{this.totalUpsellsCost=(this.totalUpsellsCost||0)-(e.detail.cost||0),this.updateUpsellsTotal(),this.updatePoseFlag(e.detail.handle,null)})}updatePoseFlag(handle,poseValue){const hasPose=!!poseValue&&poseValue!=="Aucune";if(handle?.startsWith("grips-de-"))this.hasGrip=hasPose;else if(handle?.startsWith("surgrips-de-"))this.hasSurgrip=hasPose;else return;this.recalcPoseTierDelta(),this.updateTotalOptionsCost()}recalcPoseTierDelta(){const price=(resolvePoseVariant(CORDAGE_SPORT,{hasLogo:this.hasLogo,hasBande:this.hasBande,hasPreStretch:this.hasPreStretch,hasGrip:this.hasGrip,hasSurgrip:this.hasSurgrip})?.price||0)/100;this.poseTierDelta=price-POSE_CORDAGE_COST}updateTotalOptionsCost(){this.totalOptionsCost=(this.baseOptionsCost||0)+(this.poseTierDelta||0),this.updateOptionsAmount(this.totalOptionsCost)}handleActiveRecapSteps(){["cordage:selected","cordage:options","cordage:save-cordage-options","cordage:x-sell"].forEach(event=>this.listenToEvent(event,()=>this.activateStep(event)))}activateStep(event){const stepsToActivate=this.querySelectorAll(`[data-active-on="${event}"]`);stepsToActivate&&stepsToActivate.forEach(stepToActivate=>stepToActivate.classList.add("active"))}disableStep(event){const stepsToDisable=this.querySelectorAll(`[data-active-on="${event}"]`);stepsToDisable&&stepsToDisable.forEach(stepToDisable=>stepToDisable.classList.remove("active"))}listenToEvent(event,callback){this.container.addEventListener(event,callback)}handleQtySelector(){if(!this.qty)return;const input=this.qty.querySelector("input"),minus=this.qty.querySelector("[data-qty-minus]"),plus=this.qty.querySelector("[data-qty-plus]");!input||!minus||!plus||(minus.addEventListener("click",()=>{input.value!=="1"&&(input.value--,this.updateRacquetPrice(+input.value),this.updateAmounts(input.value),this.qtyFactor=input.value,updateCordageProgress({qty:+input.value}))}),plus.addEventListener("click",()=>{input.value!==input.max&&(input.value++,this.updateRacquetPrice(+input.value),this.updateAmounts(input.value),this.qtyFactor=input.value,updateCordageProgress({qty:+input.value}))}))}getMatchedBulkTier(qty){let tiers=[];try{tiers=JSON.parse(this.racquetPriceInfo?.dataset.racquetBulkTiers||"[]")}catch{tiers=[]}let matchedTier=null;
1return tiers.forEach(([tierQty,tierPrice])=>{tierQty<=qty&&(!matchedTier||tierQty>matchedTier.qty)&&(matchedTier={qty:tierQty,price:tierPrice})}),matchedTier}getRacquetUnitPrice(qty){if(!this.racquetPriceInfo)return null;const basePrice=parseFloat(this.racquetPriceInfo.dataset.racquetBasePrice);if(Number.isNaN(basePrice))return null;const matchedTier=this.getMatchedBulkTier(qty);return matchedTier?Math.min(basePrice,matchedTier.price):basePrice}formatAmount(value){const rounded=Math.round(value*100)/100;return Number.isInteger(rounded)?String(rounded):rounded.toFixed(2)}updateBulkDisplay(matchedTier){if(!matchedTier||!this.racquetBulkDisplay)return;const quantityEl=this.racquetBulkDisplay.querySelector(".product-bulk__quantity"),priceEl=this.racquetBulkDisplay.querySelector(".product-bulk__price-amount");if(!quantityEl||!priceEl)return;const unitPrice=this.getRacquetUnitPrice(matchedTier.qty);if(unitPrice===null)return;unitPrice<matchedTier.price?this.racquetBulkDisplay.style.display="none":this.racquetBulkDisplay.style.display="block";const symbol=this.racquetPriceInfo.dataset.currencySymbol||"",template=this.racquetBulkDisplay.dataset.bulkQuantityTemplate||"";quantityEl.textContent=template.replace("__QTY__",matchedTier.qty),priceEl.textContent=`${this.formatAmou
1nt(matchedTier.price)} ${symbol}`}updateRacquetPrice(qty){const matchedTier=this.getMatchedBulkTier(qty),unitPrice=this.getRacquetUnitPrice(qty);if(unitPrice!==null){if(this.racquetUnitPriceEl){const symbol=this.racquetPriceInfo.dataset.currencySymbol||"";this.racquetUnitPriceEl.textContent=`${this.formatAmount(unitPrice)} ${symbol}`}this.updateBulkDisplay(matchedTier),this.querySelectorAll(".cordage__recap--total-amount [data-amount-to-update]").forEach(amount=>{amount.dataset.amount=(unitPrice+POSE_CORDAGE_COST).toFixed(2)})}}updateAmounts(qty=1){const amountToUpdate=this.querySelectorAll("[data-amount-to-update]"),cordageQty=this.cordageIsBobine?1:qty;amountToUpdate.forEach(amount=>{const base=+amount.dataset.amount,options=+amount.dataset.amountOptions||0,cordage=+amount.dataset.amountCordage||0,upsells=+amount.dataset.amountUpsells||0,newAmount=(base+upsells)*qty+(options+cordage)*cordageQty;amount.textContent=newAmount.toFixed(2)})}parsePrice(value){const numeric=parseFloat(String(value).replace(/[^0-9,.-]/g,"").replace(",","."));return Number.isNaN(numeric)?0:numeric}updateCordageAmount(){const totalAmount=this.querySelector(".cordage__recap--total-amount").querySelector("[data-amount-options]");totalAmount.dataset.amountCordage=this.cordageCost;const options=+totalAmount.dataset.amountOptions||0,upsells=+totalAmount.dataset.amountUpsells||0,cordageQty=this.cordageIsBobine?1:this.qtyFactor;totalAmount.textContent=((+totalAmount.dataset.amount+upsells)*this.qtyFactor+(options+ +totalAmount.dataset.amountCordage)*cordageQty).toFixed(2)}removeRecapInfos(){this.querySelector(".cordage__recap--cordage")?.remove(),this.qtyFactor=1,this.querySelector("#cordageQty")&&(this.querySelector("#cordageQty").value=1,this.updateAmounts(1)),this.querySelectorAll(".cordage__recap--option-type")?.forEach(el=>el.remove()),this.querySelectorAll(".cordage__recap--upsell")?.forEach(el=>el.remove()),this.querySelectorAll(".cordage__upsell--added")?.forEach(el=>el.remove()),this.container.querySelectorAll(".cordage__variants input")?.forEach(el=>el.checked=!1),this.container.querySelectorAll(".cordage__questions input")?.forEach(el=>el.checked=el.defaultChecked),this.totalUpsellsCost=0,this.cordageCost=0,this.cordageIsBobine=!1,this.baseOptionsCost=0,this.poseTierDelta=0,this.hasLogo=!1,this.hasBande=!1,this.hasPreStretch=!1,this.hasGrip=!1,this.hasSurgrip=!1,this.updateOptionsAmount(0),this.updateCordageAmount(),this.updateUpsellsTotal(),["cordage:selected","cordage:options","cordage:save-cordage-options","cordage:x-sell"].forEach(event=>this.disableStep(event))}handleSelectedCordage(infos){const step=this.querySelector('[data-active-on="cordage:selected"]'),template=this.querySelector("#cordageRecapProductCordage"),existing=step.querySelector(".cordage__recap--cordage");existing&&existing.remove();const clone=template.content.cloneNode(!0);clone.querySelector(".flex").classList.add("cordage__recap--cordage");const img=clone.querySelector("img");img.src=infos.image,img.alt=infos.title,clone.querySelector(".title").textContent=infos.title,clone.querySelector(".price").textContent=infos.price,clone.querySelector(".tag--variant").textContent=infos.variantTitle,infos.variantTitle==="Default Title"&&clone.querySelector(".tag--variant").classList.add("sr-only");const compare=clone.querySelector(".compare"),tag=clone.querySelector(".tag");infos.compare?(compare.textContent=infos.compare,tag.textContent=`-${infos.percentage}%`):(compare.remove(),tag.remove()),clone.querySelector("[data-cordage-reset]").addEventListener("click",()=>{this.container.dispatchEvent(new CustomEvent("cordage:reset"))}),step.appendChild(clone);const bobineLabel=(this.container.dataset.bobineLabel||"").toLowerCase();this.cordageIsBobine=bobineLabel!==""&&!!infos.title?.toLowerCase().includes(bobineLabel),this.cordageCost=this.parsePrice(infos.price),this.updateCordageAmount()}storeOptions(cordageOptions){this.baseOptionsCost=0;const step=this.querySelector(".cordage__recap--options-basic"),template=this.querySelector("#cordageRecapOptions"),existingElements=step.querySelectorAll(".cordage__recap--option-type");
1existingElements&&existingElements.forEach(el=>el.remove());const clone=template.content.cloneNode(!0);if(cordageOptions.expertVariantId!==null)clone.querySelector(".cordage__recap--options").style.display="none";else{clone.querySelector(".cordage__recap--expert").style.display="none";const replaceValue=(id,value)=>{const el=clone.querySelector(`#${id} strong`);el&&(el.textContent=value)};["montant","travers","preStretch","noeuds"].forEach(option=>{const optionValue=cordageOptions[option];if(!optionValue)return;const valueToSend=optionValue.value?optionValue.value:optionValue;replaceValue(option,valueToSend),option==="noeuds"&&optionValue.cost&&(this.baseOptionsCost+=optionValue.cost)})}this.hasPreStretch=cordageOptions.preStretch?.value==="Oui",step.appendChild(clone)}storeSupplementaryOptions(cordageOptions){const step=this.querySelector(".cordage__recap--options-supplementary"),template=this.querySelector("#cordageRecapOptionsSupplementary");if(!step||!template)return;const existingElements=step.querySelectorAll(".cordage__recap--option-type");existingElements&&existingElements.forEach(el=>el.remove());const clone=template.content.cloneNode(!0),replaceValue=(id,value)=>{const el=clone.querySelector(`#${id} strong`);el&&(el.textContent=value)};["logo","protection"].forEach(option=>{const valueToSend=cordageOptions[option].value?cordageOptions[option].value:cordageOptions[option];replaceValue(option,valueToSend)}),this.hasLogo=cordageOptions.logo?.value==="Oui",this.hasBande=cordageOptions.protection?.value==="Oui",step.appendChild(clone)}updateOptionsAmount(amount){this.container.querySelectorAll(".cordage__recap--total-amount").forEach(total=>{const totalAmount=total.querySelector("[data-amount-options]");totalAmount.dataset.amountOptions=amount;const cordage=+totalAmount.dataset.amountCordage||0,upsells=+totalAmount.dataset.amountUpsells||0,cordageQty=this.cordageIsBobine?1:this.qtyFactor;totalAmount.textContent=((+totalAmount.dataset.amount+upsells)*this.qtyFactor+(+totalAmount.dataset.amountOptions+cordage)*cordageQty).toFixed(2)})}updateUpsellsTotal(){this.container.querySelectorAll(".cordage__recap--total-amount").forEach(total=>{const totalAmount=total.querySelector("[data-amount-options]");totalAmount.dataset.amountUpsells=this.totalUpsellsCost;const cordage=+totalAmount.dataset.amountCordage||0,cordageQty=this.cordageIsBobine?1:this.qtyFactor;totalAmount.textContent=((+totalAmount.dataset.amount+ +totalAmount.dataset.amountUpsells)*this.qtyFactor+(+totalAmount.dataset.amountOptions+cordage)*cordageQty).toFixed(2)})}}customElements.define("cordage-recap",CordageRecap);class CordageSearch extends HTMLElement{connectedCallback(){this.input=this.querySelector("[data-cordage-search-input]"),this.button=this.querySelector(".cordage__search--button"),this.grid=this.closest(".cordage__collection")?.querySelector("[data-cordage-product-grid]"),this.emptyState=this.grid?.querySelector("[data-cordage-search-empty]"),this.input?.addEventListener("input",()=>this.filterProducts()),this.button?.addEventListener("click",()=>this.filterProducts());const filtersPanel=document.querySelector(".cordage__collection--filters-panel");filtersPanel&&this.addEventListener("click",()=>filtersPanel.setAttribute("hidden",!0))}filterProducts(){if(!this.grid)return;const query=this.input.value.trim().toLowerCase(),cards=this.grid.querySelectorAll(".cordage__collection--card");let visibleCount=0;cards.forEach(card=>{const matches=card.dataset.terms.includes(query);card.classList.toggle("hidden",!matches),matches&&visibleCount++}),this.emptyState&&(this.emptyState.hidden=query===""||visibleCount>0)}}customElements.define("cordage-search",CordageSearch);class CordageSort extends HTMLElement{connectedCallback(){this.select=this.querySelector("select"),this.container=this.closest(".cordage__container"),this.grid=this.closest(".cordage__collection")?.querySelector("[data-cordage-product-grid]"),this.emptyState=this.grid?.querySelector("[data-cordage-search-empty]"),this.select?.addEventListener("change",()=>this.sortProducts())}sortProducts(){if(!this.grid)return;const sorter={"a-z":(a,b)=>a.dataset.terms.localeCompare(b.dataset.terms),"z-a":(a,b)=>b.dataset.terms.localeCompare(a.dataset.terms),"price-up":(a,b)=>+a.dataset.price-+b.dataset.price,"price-down":(a,b)=>+b.dataset.price-+a.dataset.price}[this.select.value];if(!sorter)return;const brand=this.container?.dataset.brand,withBrandPriority=(a,b)=>{if(brand){const aMatch=a.dataset.vendor===brand?0:1,bMatch=b.dataset.vendor===brand?0:1;if(aMatch!==bMatch)return aMatch-bMatch}return sorter(a,b)};[...this.grid.querySelectorAll(".cordage__collection--card")].sort(withBrandPriority).forEac
1h(card=>this.grid.insertBefore(card,this.emptyState))}}customElements.define("cordage-sort",CordageSort);function restoreCordageOptionInputs(container,options){const applyInput=input=>{input&&(input.checked=!0,input.dispatchEvent(new Event("input",{bubbles:!0})))};if(options.expertVariantId){applyInput(container.querySelector("#expert-yes"));return}if(applyInput(container.querySelector("#expert-no")),options.montant){const montant=container.querySelector("#cordage-montant");montant&&(montant.value=options.montant,montant.dispatchEvent(new Event("input",{bubbles:!0})))}if(options.travers){const travers=container.querySelector("#cordage-travers");travers&&(travers.value=options.travers,travers.dispatchEvent(new Event("input",{bubbles:!0})))}options.noeuds?.value&&applyInput(container.querySelector(`input[name="noeuds"][value="${options.noeuds.value}"]`)),options.preStretch?.value&&applyInput(container.querySelector(`input[name="preStretch"][value="${options.preStretch.value}"]`))}function restoreCordageProgress(){const progress=window.cordageProgress,container=document.querySelector(".cordage__container");if(!container||!progress)return;const body=container.querySelector("cordage-body"),recap=container.querySelector("cordage-recap");if(recap&&progress.qty>1){const qtyInput=recap.qty?.querySelector("input");qtyInput&&(qtyInput.value=progress.qty),recap.qtyFactor=progress.qty}progress.cordageInfos&&container.dispatchEvent(new CustomEvent("cordage:selected",{detail:{productInfos:progress.cordageInfos}})),progress.cordageOptions&&(container.dispatchEvent(new CustomEvent("cordage:options",{detail:{options:progress.cordageOptions}})),recap?.activateStep("cordage:save-cordage-options"),restoreCordageOptionInputs(container,progress.cordageOptions),window.variantsToAdd.expert=progress.cordageOptions.expertVariantId?{id:progress.cordageOptions.expertVariantId,quantity:1}:null),body&&progress.qcmResults&&(body.results=progress.qcmResults),Object.entries(progress.upsells||{}).forEach(([handle,selection])=>{body?.applyUpsellSelection(handle,selection),container.dispatchEvent(new CustomEvent("cordage:x-sell",{detail:{...selection,handle}}))}),progress.screen==="collection"&&progress.collection?.handle&&(progress.collection.source==="upsells"&&body&&(body.currentUpsellHandle=progress.collection.handle),body?.renderCollection(progress.collection),container.querySelector("cordage-footer")?.disabledNextButton()),progress.step>1&&container.dispatchEvent(new CustomEvent("cordage:step",{detail:{step:progress.step,loadEvents:!1}})),progress.screen&&progress.screen!=="home"&&container.dispatchEvent(new CustomEvent("cordage:screen",{detail:{screen:progress.screen}}))}restoreCordageProgress();
2//# sourceMappingURL=/cdn/shop/t/2/assets/module-cordage.js.map?v=123751940583334090521790085940

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.