PageSourceSearch

https://www.thediamondstore.co.uk/cdn/shop/t/243/assets/cart-recom…?v=131124050150911131941789376683

js thediamondstore.co.uk collected 2026-09-28 05:43:06 UTC 18,981 bytes, 2 lines download raw bytes

1import{cart}from"@theme/cart";import{ModalController}from"@theme/modal-controller";import{cartRecommendations as recControllerDefault}from"@theme/cart-recommendations";export class CartRecommendationsModal{constructor({autoBind=!0}={}){this.cart=cart,this.modal=new ModalController,this.recController=recControllerDefault||null,this.state={bound:!1,lastOpenedAt:0,minIntervalMs:400,isOpen:!1,syncClosing:!1,dismissed:!1},this.elements={overlay:null,container:null},this.listenerRemovers=[],this.abortController=null,this.mediaQuery=null,this.mediaQueryChangeHandler=null,this.resizeDebounceTimer=null,this.handleCartUpdated=this.handleCartUpdated.bind(this),this.handleSectionsRendered=this.handleSectionsRendered.bind(this),this.handleSideCartOpened=this.handleSideCartOpened.bind(this),this.handleSideCartClosed=this.handleSideCartClosed.bind(this),this.handleModalClosed=this.handleModalClosed.bind(this),this.handleDocumentClick=this.handleDocumentClick.bind(this),this.handleResize=this.handleResize.bind(this),this.handleBreakpointChange=this.handleBreakpointChange.bind(this),autoBind&&this.bind()}addListener(target,type,handler,options={}){if(!target||typeof target.addEventListener!="function")return;const listenerOptions={...options};!listenerOptions.signal&&this.abortController?.signal&&(listenerOptions.signal=this.abortController.signal),target.addEventListener(type,handler,listenerOptions);const capture=typeof options=="object"&&options!==null&&Object.prototype.hasOwnProperty.call(options,"capture")?options.capture:!1;this.listenerRemovers.push(()=>{if(typeof target.removeEventListener=="function")try{target.removeEventListener(type,handler,capture)}catch(err){console.warn(`CartRecommendationsModal: failed to remove listener for ${type}`,err)}})}bind(){if(!this.state.bound){if(typeof window>"u"||typeof document>"u"){this.state.bound=!0;return}this.abortController=new AbortController,this.listenerRemovers=[],this.addListener(window,"cart:updated",this.handleCartUpdated),this.addListener(window,"cart:sections-rendered",this.handleSectionsRendered),this.addListener(window,"side_cart_opened",this.handleSideCartOpened),this.addListener(window,"side_cart_closed",this.handleSideCartClosed),this.addListener(window,"cart-recommendations-modal-closed",this.handleModalClosed),this.addListener(document,"click",this.handleDocumentClick),this.addListener(window,"resize",this.handleResize,{passive:!0});try{typeof window<"u"&&window.matchMedia&&(this.mediaQuery=window.matchMedia("(min-width:1200px)"),this.mediaQueryChangeHandler=this.handleBreakpointChange,typeof this.mediaQuery.addEventListener=="function"?this.mediaQuery.addEventListener("change",this.mediaQueryChangeHandler):typeof this.mediaQuery.addListener=="function"&&this.mediaQuery.addListener(this.mediaQueryChangeHandler),this.abortController?.signal&&typeof this.abortController.signal.addEventListener=="function"&&this.abortController.signal.addEventListener("abort",()=>{this.mediaQuery&&(typeof this.mediaQuery.removeEventListener=="function"?this.mediaQuery.removeEventListener("change",this.mediaQueryChangeHandler):typeof this.mediaQuery.removeListener=="function"&&this.mediaQuery.removeListener(this.mediaQueryChangeHandler))},{once:!0}))}catch(err){console.warn("CartRecommendationsModal: failed to initialise viewport listeners",err)}this.state.bound=!0}}teardownMatchMedia(){if(!(!this.mediaQuery||!this.mediaQueryChangeHandler)){try{typeof this.mediaQuery.removeEventListener=="function"?this.mediaQuery.removeEventListener("change",this.mediaQueryChangeHandler):typeof this.mediaQuery.removeListener=="function"&&this.mediaQuery.removeListener(this.mediaQueryChangeHandler)}catch(err){console.warn("CartRecommendationsModal: failed to remove media query listener",err)}this.mediaQuery=null,this.mediaQueryChangeHandler=null}}destroy(){if(this.state.bound){if(this.abortController)try{this.abortController.abort()}catch(err){console.warn("CartRecommendationsModal: aborting listeners failed",err)}this.listenerRemovers.forEach(remove=>{try{remove()}catch(err){console.warn("CartRecommendationsModal: removing listener failed",err)}}),this.listenerRemovers=[],this.teardownMatchMedia(),this.resizeDebounceTimer&&((typeof window<"u"?window.clearTimeout:clearTimeout)(this.resizeDebounceTimer),this.resizeDebounceTimer=null),this.abortController=null,this.state.bound=!1}}syncModalWithViewport(matches){const drawer=document.querySelector(this.cart.selectors.cartDrawerContainer),drawerOpen=!!(drawer&&drawer.classList&&drawer.classList.contains("is-open"));if(!matches){if(this.state.isOpen){this.state.syncClosing=!0;try{this.close()}finally{this.state.syncClosing=!1}}return}matches&&drawerOpen&&!this.state.isOpen&&Promise.resolve(this.open()).catch(()=>{})}handleSectionsRendered(event){if(!this.state.isOpen){this.discardMountedOverlay();return}try{const sections=event?.detail?.sections||[];Array.isArray(sections)&&(sections.includes("cart-recommendations")||sections.includes("drawer")||sections.includes("cart"))&&(this.applyModalHeading(this.elements.overlay||document),this.reloadRecommendations().catch(err=>{console.warn("CartRecommendationsModal: failed to reload after sections-rendered",err)}))}catch(err){console.warn("CartRecommendationsModal: sections-rendered handler failed",err)}}handleSideCartOpened(){Promise.resolve(this.open()).catch(err=>{console.warn("CartRecommendationsModal: failed to open when sidecart opened",err)})}handleSideCartClosed(){if(this.state.dismissed=!1,!(this.state.syncClosing||!this.state.isOpen)){this.state.syncClosing=!0;try{this.close()}finally{this.state.syncClosing=!1}}}handleModalClosed(){if(!this.state.syncClosing){this.state.syncClosing=!0;try{typeof this.cart.closeSideCart=="function"&&this.cart.closeSideCart()}finally{this.state.syncClosing=!1}}}dismiss(){this.state.dismissed=!0,this.state.syncClosing=!0;try{this.close()}finally{this.state.syncClosing=!1}}handleDocumentClick(event){if(event.target.closest("[data-cart-recs-dismiss]")){event.preventDefault(),this.dismiss();return}const triggerSelectors=["[data-open-cart-recs-modal]","[data-open-cart-recommendations]","[data-open-recommendations]","[data-open-cart-recs]",'[data-modal-open="cart-recommendations"]',".openCartRecs",".openCartRecommendations"];let trigger=null;for(let i=0;i<triggerSelectors.length;i+=1){const selector=triggerSelectors[i];if(trigger=event.target.closest(selector),trigger)break}trigger&&(event.preventDefault(),this.state.dismissed=!1,Promise.resolve(this.open()).catch(err=>{console.warn("CartRecommendationsModal: failed to open via trigger",err)}))}handleResize(){const clear=typeof window<"u"?window.clearTimeout:clearTimeout,schedule=typeof window<"u"?window.setTimeout:setTimeout;this.resizeDebounceTimer&&clear(this.resizeDebounceTimer),this.resizeDebounceTimer=schedule(()=>{this.resizeDebounceTimer=null,!(typeof window>"u"||!window.matchMedia)&&this.syncModalWithViewport(window.matchMedia("(min-width:1200px)").matches)},100)}handleBreakpointChange(event){this.syncModalWithViewport(!!event.matches)}discardMountedOverlay(){const overlay=this.elements.overlay||document.querySelector('[data-modal="cart-recommendations"]');!overlay||overlay.classList?.contains("modal-overlay--visible")||(overlay.remove?.(),this.elements.overlay=null,this.elements.container=null)}mountFromTemplate(){const existingOverlay=this.elements.overlay&&document.body.contains(this.elements.overlay)?this.elements.overlay:document.querySelector('[data-modal="cart-recommendations"]');if(existingOverlay)return this.elements.overlay=existingOverlay,this.elements.container=this.findModalContainer(existingOverlay),existingOverlay;const tpl=document.getElementById("cart-recs-modal-template");if(!tpl)return null;const root=tpl.content?.firstElementChild;if(!root)return null;const overlay=root.cloneNode(!0);return overlay.dataset.modalNoDim="true",document.body.appendChild(overlay),this.elements.overlay=overlay,this.elements.container=this.findModalContainer(overlay),overlay}findModalContainer(overlay,ctrl=null){const root=overlay||this.elements.overlay,controller=ctrl||this.recController||null;if(!root)return null;const selectors=controller?.selectors||{},containerSelector=selectors.cartRecommendationsContainer||"[data-cart-recommendations-container],[side-cart-recommended-container]",sliderSelector=selectors.cartRecommendationsSlider||selectors.sliderSelector||"[data-cart-recommendations-slider],[theme-settings-recommendations]";return root.querySelector(containerSelector)||root.querySelector(sliderSelector)||null}
1async resolveController(){if(this.recController)return this.recController;try{const ctrl=await this.cart.getRecommendationsController();return this.recController=ctrl,ctrl}catch(error){return console.warn("CartRecommendationsModal: failed to resolve recommendations controller",error),null}}getRecommendationContext(ctrl){const recommendationsSection=ctrl.getRecommendationsSectionElement?.()||document.querySelector(ctrl.selectors.cartRecommendationsSection),sectionId=recommendationsSection?.dataset?.sectionId||recommendationsSection?.getAttribute?.("data-section-id")||null,limitAttr=recommendationsSection?.dataset?.limit||recommendationsSection?.getAttribute?.("data-limit"),parsedLimit=limitAttr?Number(limitAttr):NaN,limit=Number.isFinite(parsedLimit)?parsedLimit:5,productId=ctrl.getFirstProductId?.()||(this.cart?.items?.[0]?.product_id??null);return{sectionId,productId,limit}}getModalSliderElements(root=null){const scope=root||this.elements.overlay||document,sliderSelector=this.recController?.selectors?.cartRecommendationsSlider||"[data-cart-recommendations-slider],[theme-settings-recommendations],.cart-recommendations-slider",sliderElement=scope.querySelector?.(sliderSelector)||scope.querySelector?.(".cart-recommendations-slider")||scope.querySelector?.("[data-blaze-slider]")||null,nextBtn=scope.querySelector?.(".blaze-button-next.cart-rec")||document.querySelector(".blaze-button-next.cart-rec"),prevBtn=scope.querySelector?.(".blaze-button-prev.cart-rec")||document.querySelector(".blaze-button-prev.cart-rec");return{sliderElement,nextBtn,prevBtn}}bindModalNavigation(root=null){const{sliderElement,nextBtn,prevBtn}=this.getModalSliderElements(root);if(!sliderElement)return;nextBtn&&(nextBtn.style.display=""),prevBtn&&(prevBtn.style.display="");const instance=sliderElement.__themeBlazeSlider||sliderElement.__cartRecommendationsslider||sliderElement.slider||null;if(instance){if(nextBtn){nextBtn.__cartRecNextHandler&&nextBtn.removeEventListener("click",nextBtn.__cartRecNextHandler);const nextHandler=()=>{try{typeof instance.next=="function"&&instance.next()}catch(err){console.warn("CartRecommendationsModal: next navigation failed",err)}};nextBtn.__cartRecNextHandler=nextHandler,nextBtn.addEventListener("click",nextHandler),nextBtn.__cartRecNextBound=!0}if(prevBtn){prevBtn.__cartRecPrevHandler&&prevBtn.removeEventListener("click",prevBtn.__cartRecPrevHandler);const prevHandler=()=>{try{typeof instance.prev=="function"&&instance.prev()}catch(err){console.warn("CartRecommendationsModal: previous navigation failed",err)}};prevBtn.__cartRecPrevHandler=prevHandler,prevBtn.addEventListener("click",prevHandler),prevBtn.__cartRecPrevBound=!0}}}applyModalHeading(scope,sourceRoot=null,replacement=null){const title=scope?.querySelector?.("#cart-recs-title")||document.querySelector("#cart-recs-title");if(!title)return;const heading=((replacement?.getAttribute?.("data-recs-heading")?replacement:null)||sourceRoot?.querySelector?.("[data-recs-heading]")||document.querySelector("[data-cart-recommendations-section][data-recs-heading]")||document.querySelector("[data-recs-heading]"))?.getAttribute?.("data-recs-heading");heading&&(title.innerHTML=heading)}async injectMarkupIntoModal({ctrl,container,overlay,html}){if(!html||!container)return{handled:!1,hasProducts:!1};const wrapper=document.createElement("div");wrapper.innerHTML=html;const sourceRoot=wrapper.querySelector("#cart-recs-modal-template, template")?.content||wrapper,replacement=((typeof container.matches=="function"?container.matches(ctrl.selectors.cartRecommendationsContainer):!1)?sourceRoot.querySelector(ctrl.selectors.cartRecommendationsContainer):sourceRoot.querySelector(ctrl.selectors.cartRecommendationsSlider))||sourceRoot.querySelector(ctrl.selectors.cartRecommendationsContainer)||sourceRoot.querySelector(ctrl.selectors.cartRecommendationsSlider)||sourceRoot.querySelector(".cart-recommendations-slider")||sourceRoot.querySelector("[data-blaze-slider]")||sourceRoot.firstElementChild;if(!replacement)return{handled:!1,hasProducts:!1};container.innerHTML=replacement.innerHTML??replacement.outerHTML,this.applyModalHeading(overlay||container,sourceRoot,replacement),typeof ctrl.initRecommendationsSlider=="function"&&ctrl.initRecommendationsSlider(overlay||container),this.bindModalNavigation(overlay||container);const hasProducts=replacement.querySelectorAll&&replacement.querySelectorAll(".product").length>0||replacement.querySelectorAll&&replacement.querySelectorAll("slider-slide").length>0;return hasProducts&&(ctrl?.state&&(ctrl.state.hydrated=!0),window.dispatchEvent(new CustomEvent("cart:recommendations-loaded",{detail:{element:container}}
1))),{handled:!0,hasProducts}}modalHasRecommendationSlides(root=null){const scope=root||this.elements.overlay||document,container=this.findModalContainer(scope);return container?container.querySelectorAll(".blaze-track > *").length>0:!1}async waitForBlazeController(maxMs=2e3){const start=Date.now();for(;!window.themeBlazeSliderController&&Date.now()-start<maxMs;)await new Promise(resolve=>setTimeout(resolve,50));return window.themeBlazeSliderController||null}playEntryAnimation(root=null){const overlay=root||this.elements.overlay;if(!overlay)return;const panel=overlay.querySelector(".modal-panel")||overlay.querySelector(".modal-content");if(!panel)return;panel.classList.remove("slide-in-active"),panel.offsetWidth;const activate=()=>panel.classList.add("slide-in-active");if(typeof requestAnimationFrame=="function"){requestAnimationFrame(()=>requestAnimationFrame(activate));return}activate()}async finalizeModalSliderAfterOpen(root=null){const ctrl=await this.resolveController();await this.waitForBlazeController();const{sliderElement}=this.getModalSliderElements(root);sliderElement&&(typeof ctrl?.initRecommendationsSlider=="function"&&ctrl.initRecommendationsSlider(root||sliderElement.closest('[data-modal="cart-recommendations"]')||document),await new Promise(resolve=>{const sync=()=>{const blazeController=window.themeBlazeSliderController;blazeController&&blazeController.refresh(sliderElement),sliderElement.classList.remove("blaze-loading"),resolve()};if(typeof requestAnimationFrame=="function"){requestAnimationFrame(()=>requestAnimationFrame(sync));return}sync()}))}async loadModalRecommendations({force=!1,skipDrawerEnsure=!1}={}){if(force&&typeof this.cart.refreshCartData=="function")try{await this.cart.refreshCartData({silent:!0})}catch(error){console.warn("CartRecommendationsModal: refreshCartData failed",error)}if(!skipDrawerEnsure)try{await this.cart.ensureDrawerContent({includeRecommendations:!0,reason:force?"recs-modal:reload":"recs-modal"})}catch(error){console.warn("CartRecommendationsModal: ensureDrawerContent failed",error)}const ctrl=await this.resolveController();if(!ctrl||!ctrl.loadRecommendations&&!ctrl.fetchRecommendationMarkup)return;force&&ctrl.state&&(ctrl.state.hydrated=!1);const overlay=this.mountFromTemplate(),container=this.findModalContainer(overlay,ctrl);this.elements.overlay=overlay,this.elements.container=container;const{sectionId,productId,limit}=this.getRecommendationContext(ctrl);if(container&&ctrl.fetchRecommendationMarkup&&sectionId&&productId)try{const html=await ctrl.fetchRecommendationMarkup({sectionId,productId,limit,force});if((await this.injectMarkupIntoModal({ctrl,container,overlay,html})).handled)return}catch(error){console.warn("CartRecommendationsModal: failed to inject markup",error)}try{await ctrl.loadRecommendations({limit,force}),typeof ctrl.initRecommendationsSlider=="function"&&ctrl.initRecommendationsSlider(overlay||document),this.applyModalHeading(overlay||document)}catch(error){console.warn("CartRecommendationsModal: fallback loadRecommendations failed",error)}}async ensureRecommendationsLoaded({skipDrawerEnsure=!1}={}){await this.loadModalRecommendations({force:!1,skipDrawerEnsure})}async open(){if(this.state.dismissed)return;const now=Date.now();if(now-this.state.lastOpenedAt<this.state.minIntervalMs||(this.state.lastOpenedAt=now,!window.matchMedia||!window.matchMedia("(min-width:1200px)").matches))return;const overlay=this.mountFromTemplate(),modalContent=overlay?overlay.querySelector(".modal-content"):null,drawer=document.querySelector(this.cart.selectors.cartDrawerContainer),drawerOpen=!!(drawer&&drawer.classList&&drawer.classList.contains("is-open"));overlay&&(overlay.style.background="transparent",drawerOpen?modalContent&&modalContent.classList.remove("modal-fullwidth"):modalContent&&modalContent.classList.add("modal-fullwidth")),this.modalHasRecommendationSlides(overlay)||await this.ensureRecommendationsLoaded({skipDrawerEnsure:!0}),this.modal.presentModal("cart-recommendations",0,null,{skipSlideIn:!0}),this.state.isOpen=!0;try{const active=document.querySelector('[data-modal="cart-recommendations"]'),panel=active?active.firstElementChild:null;
1panel&&!drawerOpen&&(panel.classList.add("modal-fullwidth"),panel.style.maxWidth="none",panel.style.width="calc(100% - 48px)",panel.style.margin="24px auto")}catch(err){console.warn("CartRecommendationsModal: failed to enforce fullwidth layout",err)}try{await this.finalizeModalSliderAfterOpen(overlay),this.bindModalNavigation(overlay||document)}catch(err){console.warn("CartRecommendationsModal: failed to finalize modal slider",err)}finally{this.playEntryAnimation(overlay)}}close(){try{this.modal.hideModal("cart-recommendations")}finally{this.state.isOpen=!1}}async handleCartUpdated(event){if((event?.detail||{}).action==="add"){if(this.state.isOpen)try{await this.reloadRecommendations()}catch(err){console.warn("CartRecommendationsModal: failed to reload after add",err)}return}if(this.state.isOpen)try{await this.reloadRecommendations()}catch(err){console.warn("CartRecommendationsModal: failed to reload recommendations",err)}}async reloadRecommendations(){if(await this.loadModalRecommendations({force:!0,skipDrawerEnsure:!0}),!!this.state.isOpen)try{await this.finalizeModalSliderAfterOpen(this.elements.overlay),this.bindModalNavigation(this.elements.overlay||document)}catch(err){console.warn("CartRecommendationsModal: failed to refresh slider after reload",err)}}}export const cartRecommendationsModal=new CartRecommendationsModal;window.CartRecommendationsModal=CartRecommendationsModal,window.cartRecommendationsModal=cartRecommendationsModal;
2//# sourceMappingURL=/cdn/shop/t/243/assets/cart-recommendations-modal.js.map?v=131124050150911131941789376683

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.