{"version":3,"file":"pdp.js","sources":["../../../resources/javascript/features/pdp/up-sell/bloomreach.js","../../../resources/javascript/features/pdp/up-sell/index.js","../../../resources/javascript/features/pdp/showcase/index.js","../../../resources/javascript/features/positive-luxury-mark/index.js","../../../resources/javascript/bazaar-voice.js","../../../resources/javascript/entrypoint/pdp.js","../../../resources/javascript/features/topl/index.js","../../../resources/javascript/features/sale/lazy.js"],"sourcesContent":["import { abortAfterTimeout } from '../../../util/signal';\nimport { loadProductCards } from '../../recommendations';\nimport { getRecommendations } from '../../recommendations/bloomreach';\nimport { initUpgradeSwatches } from './index';\n\nexport const initBloomreachCarousel = () => {\n  $('.js-br-upgrade-block').each(async (i, container) => {\n    const $container = $(container);\n\n    const engineId = container.dataset.recEngineId;\n\n    try {\n      const abortController = new AbortController();\n      abortAfterTimeout(abortController, 10000);\n      const { signal } = abortController;\n\n      const recommendations = await getRecommendations({\n        engineId,\n        relatedProducts: container.dataset.recEngineProducts ? JSON.parse(container.dataset.recEngineProducts) : [],\n        maxRecommendationCount: 18,\n        signal,\n      });\n\n      // Make a request for each recommended product code, to get the\n      // rendered product card. In the common case, we expect the\n      // responses to be served from the CDN's response cache.\n      const cardHTML = await loadProductCards(recommendations, {\n        modifiers: ['single-finish', 'no-qatb'],\n      });\n\n      // If there are zero cards, then throw a sentinal value indicating\n      // that there are zero product recommendation cards.\n      if (cardHTML.length === 0) {\n        throw 'zero cards';\n      }\n\n      // Add the product cards to the page.\n      const contentElement = container.querySelector('.js-carousel-pdp-br-upgrade-block');\n      contentElement.innerHTML = cardHTML;\n\n      // so the carousel can have a difinitive width using calc()\n      contentElement.parentNode.style.width = `calc(155px * ${recommendations.length} * 1)`;\n\n      let title = container.querySelector('.carousel__title');\n      if (!title) {\n        title = $container.prev().find('.featured-collection-callout__subtitle')[0];\n      }\n\n      if (title) {\n        toReposition.push({\n          carousel: contentElement,\n          title,\n        });\n      }\n\n      // Add click event listeners, to track 'recommendation' events\n      // in Bloomreach. Also, append the 1-indexed position to the\n      // data-ga-label attributes.\n      contentElement.querySelectorAll('.product-preview__link').forEach((card, i) => {\n        card.setAttribute('data-position', i);\n\n        // TODO check if this actually fires consistently, before the navigation happens.\n        card.addEventListener('click', function (e) {\n          if (e.target.classList.contains('product-preview')) {\n            exponea.track('recommendation', {\n              action: 'click',\n              item_id: card.dataset.gaid,\n              recommendation_id: engineId,\n            });\n          }\n        });\n      });\n\n      $('.js-carousel-pdp-br-upgrade-block').each(function (i) {\n        this.classList.add('js-carousel--pdp-upgrade-block--' + i);\n\n        const gallery = new Carousel({\n          arrows: true,\n          dots: false,\n          infinite: true,\n          variableWidth: false,\n          appendArrows: $(this.closest('.product-details__upgrade-block').querySelector('.carousel__nav')),\n          slidesToShow: recommendations.length - 1,\n          slidesToScroll: 1,\n          touchThreshold: recommendations.length * 4, // (1/touchThreshold) * the width of the carousel (which is basically all of the images), so cancel out the massive width\n          draggable: false,\n          responsive: [{\n            breakpoint: 999,\n            settings: {\n              draggable: true,\n              arrows: false,\n              swipe: true,\n              swipeToSlide: true,\n            }\n          }],\n        }, 'pdp-upgrade-block--' + i);\n\n        initUpgradeSwatches();\n\n        const cards = document.querySelector('.product-details__upgrade-block-cards').children;\n        const list = cards[0].closest('[data-list]').dataset.list;\n        const items = [];\n\n        // GA4 tracking\n        for (let i = 0; i < cards.length; i++) {\n          if (cards[i].classList.contains('product-details__upgrade-block-empty-card')) {\n            continue;\n          }\n          cards[i].querySelector('.js-gtm-element').addEventListener('click', (e) => MV.tracking.productElementClick(e, list, { position: i }));\n\n          items.push(MV.tracking.getProductElementData(cards[i].querySelector('.js-gtm-element'), { position: i }));\n        }\n\n        MV.tracking.impressProducts({ list, items });\n\n        gallery.init($(this));\n      });\n    } catch (e) {\n      // We failed to load any recommendations, so hide the carousel block.\n      console.log('failed to load recommendations', e);\n      container.style.display = 'none';\n    }\n  });\n}\n","import { getProductElementData, trackProductElementClick, trackProductListImpressions } from '../../tracking/list';\nimport { getTrackingPageType } from '../../tracking/page';\nimport { initBloomreachCarousel } from './bloomreach';\n\nexport const initUpgradeSwatches = function () {\n    const targets = ['.product-preview--upgrade.js-swatch-group'];\n    targets.forEach(function(target) {\n        var swatches = document.querySelectorAll(target);\n        if (swatches.length > 0) {\n            window.pdp = window.pdp || {};\n            window.pdp.upgradeSwatches = []; // Removing all existing swatches\n            swatches.forEach(function(container, position) {\n                // And create new ones\n                var sw = new ProductSwatchGroup(container,\n                    function(elem) {\n                        /**\n                         * Injecting application logic for changing the card.\n                         * In this callback you can use \"elem\" as a ProductSwatch instance.\n                         */\n                        var container = elem.controller.container;\n                        var link = container.querySelector('.js-swatch-group_link');\n\n                        if (typeof link != 'undefined') {\n                            var article = link.parentNode;\n\n                            link.dataset.galabel = elem.getData('galabel');\n                            link.dataset.gaid = elem.getData('gaid');\n                            link.dataset.price = elem.getData('pricesimple');\n\n                            link.href = elem.getData('url');\n                            var imageUrl = elem.getData('image');\n                            var hoverUrl = elem.getData('hover');\n                            try {\n                                article.dataset.cnstrcItemVariationId = elem.getData('variant');\n                                article.dataset.cnstrcItemPrice = elem.getData('pricesimple');\n                                var swatchGroupImage = link.querySelector('.js-swatch-group_image img');\n                                swatchGroupImage.src = imageUrl;\n                                swatchGroupImage.srcset = imageUrl + ' 330w';\n                                var swatchGroupHover = link.querySelector('.js-swatch-group_hover img');\n                                swatchGroupHover.src = hoverUrl;\n                                swatchGroupHover.srcset = hoverUrl + '  330w';\n                                link.querySelector('.js-swatch-group_description').textContent = elem.getData('label');\n                                var price = link.querySelector('.js-swatch-group_price');\n                                var wasPrice = price.querySelector('span:not([js-swatch-group_discount])');\n                                if (typeof elem.getData('wasprice') != 'undefined' && elem.getData('wasprice') != '') {\n                                    price.textContent = elem.getData('price');\n                                    if (typeof wasPrice == 'undefined' || !wasPrice) {\n                                        wasPrice = document.createElement('span');\n                                        if (elem.getData('discount')) {\n                                            var discount = document.createElement('span');\n                                            discount.classList.add('js-swatch-group_discount');\n                                            discount.classList.add('product-preview__price--discount');\n                                            discount.textContent = ' ' + elem.getData('discount');\n                                            price.append(discount);\n                                        }\n                                    } else {\n                                        var discount = price.querySelector('span.js-swatch-group_discount');\n                                        if (typeof discount == 'undefined' || !discount) {\n                                            if (elem.getData('discount')) {\n                                                discount = document.createElement('span');\n                                                discount.classList.add('js-swatch-group_discount');\n                                                discount.classList.add('product-preview__price--discount');\n                                                discount.textContent = ' ' + elem.getData('discount');\n                                                price.append(discount);\n                                            }\n                                        }\n                                    }\n                                    wasPrice.textContent = elem.getData('wasprice');\n                                    price.prepend(wasPrice);\n                                    if (!price.classList.contains('product-preview__price--was')) {\n                                        price.classList.add('product-preview__price--was');\n                                    }\n                                } else {\n                                    if (typeof wasPrice != 'undefined' && wasPrice) {\n                                        wasPrice.remove();\n                                    }\n                                    price.textContent = elem.getData('price')\n                                    if (price.classList.contains('product-preview__price--was')) {\n                                        price.classList.remove('product-preview__price--was');\n                                    }\n                                }\n                            } catch (err) {\n                                console.log(err);\n                            }\n                        }\n\n                        trackProductListImpressions({\n                            list: `${ getTrackingPageType() ?? 'PDP' }/${ elem.element.closest('[data-ga-block-type]').dataset.gaBlockType }`,\n                            items: [\n                                getProductElementData(elem.element.closest('.js-gtm-element'), {})\n                            ]\n\n                        });\n                    },\n                    {\n                        debug: false\n                    }\n                );\n                sw.init();\n                window.pdp.upgradeSwatches.push(sw);\n            });\n        }\n    });\n}\n\nconst initUpgradeCarousel = function () {\n    // PDP Upgrade Block\n    $('.js-carousel-pdp-upgrade-block').each(function(i) {\n        this.classList.add('js-carousel--pdp-upgrade-block--' + i);\n\n        let gallery = new Carousel({\n            arrows: true,\n            appendArrows: $(this.closest('.product-details__upgrade-block').querySelector('.carousel__nav')),\n            dots: false,\n\n            slidesToShow: 3,\n            slidesToScroll: 1,\n\n            infinite: false,\n            initialSlide: 0,\n\n            swipe: true,\n            responsive: [\n              {\n                breakpoint: 1000,\n                settings: {\n                    arrows: false\n                }\n              }\n            ],\n\n        }, 'pdp-upgrade-block--' + i);\n\n        gallery.init($(this));\n    });\n}\n\n// if script is loaded via qatb\nif (document.querySelector('.js-quick-atb-wrapper') !== null) {\n    initBloomreachCarousel();\n}\n\ndocument.addEventListener('DOMContentLoaded', function() {\n  initBloomreachCarousel();\n\n  const upgradeBlock = document.querySelector('.product-details__upgrade-block:not(.js-br-upgrade-block)');\n  if (upgradeBlock !== null) {\n      initUpgradeSwatches();\n\n      const cards = document.querySelectorAll('.product-details__upgrade-block-card');\n      const list = `${ getTrackingPageType() ?? 'PDP' }/${ upgradeBlock.dataset.gaBlockType }`;\n\n      const items = [];\n\n      for (const [position, card] of cards.entries()) {\n          card.querySelector('.js-gtm-element').addEventListener('click', (e) => trackProductElementClick(e, list, { position }));\n\n          items.push(getProductElementData(card.querySelector('.js-gtm-element'), { position }));\n      }\n\n      trackProductListImpressions({list, items});\n\n      if (cards.length > 2) {\n          initUpgradeCarousel();\n      }\n  }\n\n  const upsellBlock = document.querySelector('.product-details__upsell-block');\n  if (upsellBlock !== null) {\n        const list = `${ getTrackingPageType() ?? 'PDP' }/${ upsellBlock.dataset.gaBlockType }`;\n        trackProductListImpressions({\n            list,\n            items: [getProductElementData(upsellBlock)]\n        });\n    }\n});\n","export const initTogglePayLater = () => {\n  const trigger = document.querySelector('.js-pdp-pay-later-trigger');\n\n  trigger?.addEventListener('click', () => {\n    const container = document.querySelector('.js-pdp-pay-later-container');\n    const separator = document.querySelector('.js-pdp-pay-later-separator');\n\n    container.style.display = 'block';\n    trigger.style.display = 'none';\n    separator.style.display = 'none';\n  }, {once: true});\n}\n","import { once } from 'lodash-es';\n\nconst loadScript = once(() => new Promise((resolve) => {\n  const id = 'pl-trustmark';\n\n  const js = document.createElement('script');\n  js.id = id;\n  js.src = 'https://plwidgetscript.stromdev.dk/widget.js';\n  js.async = true;\n  js.onload = function () {\n    setTimeout(function () {\n      if (window.plPassportHelper) {\n        resolve(window.plPassportHelper);\n      }\n    }, 1);\n  }\n\n  document.body.append(js);\n}));\n\nexport const initPositiveLuxuryMark = async () => {\n  try {\n    const plPassportHelper = await loadScript();\n\n    plPassportHelper.init({\n      brandId: 'a98cbe2d-e9ac-408a-a279-304c9cfb4541',\n      mode: 'widget',\n      type: 'simple-badge',\n      floating: false,\n      colorScheme: 'white',\n      align: 'left',\n    });\n  } catch (e) {\n    console.error('Error initializing Positive Luxury Mark:', e);\n  }\n};\n","/**\n * Initialize BazaarVoice customisations\n * - Injects custom styles into shadow DOM\n * - Overrides scroll behavior to account for sticky header\n */\nexport function initBazaarVoice() {\n  initBazaarVoiceStyles();\n  initBazaarVoiceSubmissionStyles();\n  initBazaarVoiceScroll();\n}\n\n/**\n * Injects custom CSS styles into BazaarVoice shadow DOM\n */\nfunction initBazaarVoiceStyles() {\n  const cssContent = `\n\n    /* Container layout */\n    #bv_review_maincontainer {\n      position: relative;\n      display: flex;\n      flex-direction: column;\n    }\n\n    /* Container padding */\n    .bv-rnr__l6jz5k-0,\n    .dAgVKO {\n      padding: 50px 0 60px;\n    }\n\n    /* Main Reviews Heading */\n    .coRjPr,\n    .bv-rnr__sc-10ra6n1-1 {\n      margin: 0 !important;\n    }\n\n    /* Product review stars and text */\n    .bv-rnr__sc-16j1lpy-2.hFNiDx {\n      letter-spacing: 0.5px;\n      padding: 0;\n      margin: 0;\n      font-size: 18px;\n      margin-bottom: 10px;\n    }\n\n    .bv-rnr__sc-16dr7i1-0.bv-rnr__sc-10ra6n1-1.coRjPr.goTcGM {\n      order: 1;\n    }\n\n    .jGIegl,\n    .bv-rnr__sc-16j1lpy-1 {\n      font-family: \"gotham\", sans-serif;\n      font-size: 29px;\n      font-weight: 300;\n      letter-spacing: 3px;\n      line-height: 0.689;\n      text-transform: uppercase;\n      color: #000;\n      margin-bottom: 10px;\n    }\n\n    /* Grid layout for rating sections */\n    .bv-rnr__sc-10ra6n1-0,\n    .jflRss {\n      border-bottom: none;\n    }\n\n    /* Remove margin around star container */\n    .bOrZYW {\n      margin: 0;\n      gap: 5px;\n    }\n\n    /* Remove padding around stars */\n    .eFshCx {\n      padding: 0;\n    }\n\n    /* Review name width */\n    .cLABuB {\n      max-width: none;\n    }\n\n    .cdREOE {\n      margin: 0;\n      padding: 0;\n    }\n\n    /* Load more button */\n    .bv-rnr__sc-17t5kn5-0.hsmBVh {\n      margin-bottom: 30px;\n    }\n\n    /* Filter reviews container */\n    .bv-rnr__sc-16dr7i1-23.coRjPr.kcdDSh {\n      margin-top: 20px !important;\n    }\n\n    /* Body text */\n    .bv-rnr__sc-16dr7i1-5,\n    .cdREOE p,\n    .cFXOAs {\n      font-family: Grotesk, Helvetica, sans-serif;\n      font-size: 12px;\n      line-height: 18px;\n      color: #000;\n      letter-spacing: 0.5px;\n    }\n\n    .iVOsbo {\n      border: none;\n    }\n\n    /* Sort dropdown */\n    .bv-rnr__sc-11r39gb-0.bkALTO {\n      margin: 0;\n    }\n\n    .jTUMEW {\n      margin: 20px 0;\n    }\n\n    .bv-rnr__sc-11r39gb-2.idOPpU {\n      display: none;\n    }\n\n    /* Overall Rating Number */\n    .kIeKvx,\n    .bv-rnr__sc-157rd1w-1 {\n      font-family: \"gotham\", sans-serif;\n      font-size: 48px;\n      font-weight: 300;\n      letter-spacing: 2px;\n      color: #000;\n    }\n\n    /* Review count text */\n    .krTpQg {\n      font-family: Grotesk, Helvetica, sans-serif;\n      font-size: 12px;\n      color: #000;\n      letter-spacing: 0.5px;\n    }\n\n    /* Star rating buttons - clean up */\n    .ehhKJQ,\n    .bv-rnr__rpifwc-2 {\n      border: none;\n      border-radius: 0;\n      padding: 10px 0;\n      transition: background-color 0.2s ease;\n    }\n\n    .ehhKJQ:hover,\n    .bv-rnr__rpifwc-2:hover {\n      background-color: #f5f5f5;\n    }\n\n    /* Rating bars */\n    .byRhYf,\n    .bv-rnr__ppunu1-1 {\n      background-color: #000;\n      height: 4px;\n    }\n\n    .eMUGun,\n    .bv-rnr__ppunu1-0 {\n      background-color: #e8e8e8;\n      height: 4px;\n    }\n\n    /* Reviewer name */\n    .hrJjGS,\n    .bv-rnr__sc-1r4hv38-0,\n    .lnQOmq {\n      font-family: Grotesk, Helvetica, sans-serif;\n      font-size: 14px;\n      font-weight: 600;\n      color: #000;\n      text-transform: none;\n      letter-spacing: 0.5px;\n    }\n\n    /* Review date */\n    .jolJQc,\n    .bv-rnr__g3jej5-1 {\n      font-family: Grotesk, Helvetica, sans-serif;\n      font-size: 12px;\n      color: #808080;\n      letter-spacing: 0.5px;\n    }\n\n    /* Review text */\n    .cFXOAs,\n    .bv-rnr__sc-16dr7i1-3 {\n      font-family: Grotesk, Helvetica, sans-serif;\n      font-size: 14px;\n      line-height: 1.5;\n      color: #000;\n      margin-top: 15px;\n      letter-spacing: 0.5px;\n    }\n\n    .bv-rnr__sc-1grr47e-3.hCiaBm {\n      font-family: Grotesk, Helvetica, sans-serif;\n      letter-spacing: 0.5px;\n    }\n\n    /* Review count badges */\n    .hNbGgF,\n    .bv-rnr__f9cpbf-2,\n    .bOwvYf {\n      font-family: Grotesk, Helvetica, sans-serif;\n      font-size: 12px;\n      font-weight: 600;\n      letter-spacing: 0.5px;\n    }\n\n    /* Star rating icons - sizing */\n    .dYouig,\n    .bv-rnr__jcyw8r-0 {\n      width: 18px;\n      height: 18px;\n    }\n\n    .fdAMbF,\n    .bv-rnr__sc-13ijx62-4 {\n      font-family: Grotesk, Helvetica, sans-serif;\n      font-size: 12px;\n      font-weight: 600;\n      letter-spacing: 1.5px;\n      text-transform: uppercase;\n    }\n\n    .ewejac {\n      border: 1px solid #000;\n      border-radius: 0;\n    }\n\n    /* \"Adding a review will require...\" text */\n    .ddZEim,\n    .bv-rnr__sc-2kyvjj-5 {\n      font-family: Grotesk, Helvetica, sans-serif;\n      font-size: 12px;\n      color: #808080;\n      margin-top: 15px;\n      margin-left: 0;\n      padding-left: 0;\n    }\n\n    /* Link styling */\n    a {\n      color: #000;\n      text-decoration: underline;\n    }\n\n    a:hover {\n      text-decoration: none;\n    }\n\n    /* Buttons */\n    .lcwhFL,\n    .bv-rnr-action-bar {\n      background: transparent;\n      border: none;\n      padding: 0;\n      font-family: Grotesk, Helvetica, sans-serif;\n      text-decoration: underline;\n      letter-spacing: 0.5px;\n    }\n\n    .caJLxM {\n      padding: 0;\n      border: none;\n    }\n\n    /* Overall spacing improvements */\n    .gQOEUn {\n      display: flex;\n      flex-direction: column-reverse;\n    }\n\n    /* Grid layout for review action columns */\n    .bv-rnr__sc-10ra6n1-0.jflRss {\n      display: grid;\n      grid-template-columns: 1fr 1fr 1fr;\n      gap: 20px;\n    }\n\n    /* Grid layout for rating sections */\n    .bv-rnr__ioct8z-0,\n    .dLooXP {\n      display: grid;\n      grid-template-columns: 1fr 1fr 1fr;\n      gap: 20px;\n      margin-bottom: 30px;\n      overflow: visible;\n    }\n\n    /* Individual rating section boxes */\n    .bv-rnr__sc-16dr7i1-1,\n    .jtRfje {\n      background-color: #fff;\n      padding: 20px;\n      border-radius: 3px;\n      margin: 0;\n      height: 100%;\n      box-sizing: border-box;\n      box-shadow: 0 10px 20px 0 rgba(0, 0, 0, 0.04);\n    }\n\n    .fVEIwG {\n      padding-left: 0;\n      padding-right: 0;\n    }\n\n    .hFQwhN {\n      padding-left: 0;\n      padding-right: 0;\n    }\n\n    .bv-rnr__sc-10ra6n1-1 {\n      margin-bottom: 40px;\n    }\n\n    .bv-rnr__zv3ryj-1 li a,\n    .bv-rnr__zv3ryj-1 li button {\n      border: none;\n      width: 40px;\n      height: 40px;\n      padding: 0;\n      display: grid;\n      place-items: center;\n    }\n\n    .bv-rnr__zv3ryj-1 li a > div,\n    .bv-rnr__zv3ryj-1 li button > div {\n      width: 18px;\n      height: 18px;\n    }\n\n    .bv-rnr__zv3ryj-1 li a svg,\n    .bv-rnr__zv3ryj-1 li button svg {\n      width: 18px;\n      height: 18px;\n    }\n\n    .bv-rnr__zv3ryj-1 li a path,\n    .bv-rnr__zv3ryj-1 li button path {\n      stroke-width: 3px;\n      stroke-linecap: square;\n      stroke-linejoin: miter;\n    }\n\n    /* Pagination */\n    .bv-rnr__sc-11r39gb-1.LinHZ {\n      position: absolute;\n      right: -25px;\n      top: 80px;\n      background: none;\n    }\n\n    /* Responsive adjustments */\n    @media (max-width: 999px) {\n      .bv-rnr__ioct8z-0.dLooXP {\n        margin-top: 1em;\n        grid-template-columns: 1fr;\n      }\n\n      .bv-rnr__sc-10ra6n1-0.jflRss {\n        grid-template-columns: 1fr;\n        margin-bottom: 30px;\n      }\n\n      .bv-rnr__l6jz5k-0,\n      .dAgVKO {\n        padding: 30px 0 0;\n      }\n\n      .bBnepd {\n        min-height: 0;\n      }\n\n      .jGIegl,\n      .bv-rnr__sc-16j1lpy-1 {\n        font-size: 24px;\n        margin-bottom: 20px;\n      }\n\n      .bv-rnr__sc-10ra6n1-1 {\n        margin-bottom: 0;\n      }\n\n      .bv-rnr__sc-2kyvjj-4.ewejac {\n        min-width: 40px;\n        min-height: 40px;\n      }\n\n      .hFNiDx,\n      .bv-rnr__sc-16j1lpy-2 {\n        margin-bottom: 0;\n      }\n\n      /* Pagination */\n      .bv-rnr__sc-11r39gb-1.LinHZ {\n        left: 0;\n        top: 110px;\n      }\n    }\n  `;\n\n  // Helper function to inject styles into shadow root\n  const injectStyles = (shadowRoot) => {\n    const style = document.createElement(\"style\");\n    style.textContent = cssContent;\n    shadowRoot.appendChild(style);\n  };\n\n  // Check if widget already exists\n  const widget = document.querySelector('[data-bv-show=\"reviews\"]');\n\n  if (widget && widget.shadowRoot) {\n    injectStyles(widget.shadowRoot);\n    return;\n  }\n\n  // If not, observe for it\n  const observer = new MutationObserver((mutations, obs) => {\n    const widget = document.querySelector('[data-bv-show=\"reviews\"]');\n    if (widget && widget.shadowRoot) {\n      injectStyles(widget.shadowRoot);\n      obs.disconnect();\n    }\n  });\n\n  observer.observe(document.body, {\n    childList: true,\n    subtree: true,\n  });\n}\n\n/**\n * Injects custom CSS styles into BazaarVoice submission widget shadow DOM\n */\nfunction initBazaarVoiceSubmissionStyles() {\n  const cssContent = `\n    .ips__sc-r8pfgm-0.bpgha-D {\n      padding-top: 20px;\n      padding-left: 30px;\n      padding-bottom: 20px;\n    }\n\n    /* Hide image */\n    .ips__sc-1pj01ak-0.iIKwdO {\n      display: none;\n    }\n\n    /* Form titles */\n    .ips__sc-r8pfgm-4.jcxkRT,\n    .ips__sc-r8pfgm-3.dHkZa {\n      font-family: Grotesk, Helvetica, sans-serif;\n      font-size: 18px;\n      letter-spacing: 0.5px;\n    }\n\n    .dRCBLk {\n      font-family: Grotesk, Helvetica, sans-serif;\n      font-size: 12px;\n      letter-spacing: 0.5px;\n      color: black;\n    }\n\n    .klPfYq {\n      padding-top: 0;\n    }\n\n    .klPfYq:focus {\n      padding-top: 0;\n    }\n\n    /* Form fields */\n    .kgiwBH,\n    .biuYCE,\n    .dMjljA,\n    .bRTtOv {\n      border-color: #b1b1b1;\n      box-shadow: none;\n      margin-top: 3px;\n      font-family: Grotesk, Helvetica, sans-serif;\n      font-size: 12px;\n      letter-spacing: 0.5px;\n      color: #000;\n      font-weight: 500;\n    }\n\n    /* Form fields */\n    .kgiwBH::placeholder,\n    .biuYCE::placeholder,\n    .dMjljA::placeholder,\n    .bRTtOv::placeholder {\n      font-family: Grotesk, Helvetica, sans-serif;\n      font-size: 12px;\n      letter-spacing: 0.5px;\n      color: grey;\n    }\n\n    /* Form fields */\n    .kgiwBH:focus,\n    .biuYCE:focus,\n    .dMjljA:focus,\n    .bRTtOv:focus {\n      border: 1px solid #000;\n      outline: none;\n    }\n\n    /* Labels and text */\n    .ips__sc-1lxbl6u-0.UaIhp,\n    .ips__sc-ppvd0v-0.ips__sc-1xe1s7l-0.dFGaIz.gjyQkj,\n    .ips__sc-170tm30-1.gOgJkE,\n    .dHpAjV {\n      font-family: Grotesk, Helvetica, sans-serif;\n      font-size: 12px;\n      letter-spacing: 0.5px;\n    }\n\n    /* Count spans */\n    .ips__sc-1lxbl6u-0.UaIhp,\n    .eRfLRs {\n      position: absolute;\n      right: 0;\n      bottom: 0;\n      transform: translateY(100%);\n    }\n\n    /* Error styles */\n    .fIHewM {\n      font-family: Grotesk, Helvetica, sans-serif;\n      font-size: 12px;\n      letter-spacing: 0.5px;\n      font-weight: 500;\n    }\n\n    .jmMiJr {\n      box-shadow: none;\n      outline: none;\n      font-family: Grotesk, Helvetica, sans-serif;\n      font-size: 12px;\n      letter-spacing: 0.5px;\n      color: #000;\n      border: 1px solid #000;\n    }\n\n    .jmMiJr:focus {\n      border: 1px solid #000;\n    }\n\n    .iPDIQn {\n      margin-bottom: 20px;\n    }\n\n    .iPDIQn:first-of-type {\n      margin-bottom: 20px;\n    }\n\n    .ips__sc-rng3f6-0.bRTtOv {\n      margin-top: 7px;\n    }\n\n    .ips__sc-ppvd0v-0.dFGaIz {\n      margin-top: 14px;\n    }\n\n    .dFGaIz label {\n      margin-top: 0;\n    }\n\n    @media (max-width: 999px) {\n      .ips__sc-r8pfgm-0.bpgha-D {\n        padding-left: 10px;\n      }\n\n      /* close button */\n      .eOzVnJ {\n        align-items: flex-start;\n        margin-top: -15px;\n      }\n\n      .cbsYNK {\n        padding: 5px;\n      }\n    }\n  `;\n\n  // Helper function to inject styles into shadow root\n  const injectStyles = (shadowRoot) => {\n    if (shadowRoot.querySelector('style[data-mv-custom]')) {\n      return;\n    }\n\n    const style = document.createElement(\"style\");\n    style.setAttribute('data-mv-custom', 'true');\n    style.textContent = cssContent;\n    shadowRoot.appendChild(style);\n  };\n\n  // Setup observer for shadowRoot content changes\n  const setupShadowRootObserver = (shadowRoot) => {\n    injectStyles(shadowRoot);\n\n    // Observe for changes within the shadowRoot in case content gets cleared/replaced\n    const shadowObserver = new MutationObserver(() => {\n      injectStyles(shadowRoot);\n    });\n\n    shadowObserver.observe(shadowRoot, {\n      childList: true,\n      subtree: false,\n    });\n  };\n\n  // Check if widget already exists\n  const widget = document.querySelector('[data-bv-show=\"inpage_submission\"]');\n\n  if (widget && widget.shadowRoot) {\n    setupShadowRootObserver(widget.shadowRoot);\n    return;\n  }\n\n  // Observe for widget and shadowRoot\n  let pollInterval = null;\n\n  const observer = new MutationObserver((mutations, obs) => {\n    const widget = document.querySelector('[data-bv-show=\"inpage_submission\"]');\n\n    if (widget && widget.shadowRoot) {\n      setupShadowRootObserver(widget.shadowRoot);\n      if (pollInterval) clearInterval(pollInterval);\n      obs.disconnect();\n    } else if (widget && !widget.shadowRoot && !pollInterval) {\n      // Element exists but shadowRoot not attached yet - poll for it\n      pollInterval = setInterval(() => {\n        const widget = document.querySelector('[data-bv-show=\"inpage_submission\"]');\n        if (widget && widget.shadowRoot) {\n          setupShadowRootObserver(widget.shadowRoot);\n          clearInterval(pollInterval);\n          obs.disconnect();\n        }\n      }, 100);\n    }\n  });\n\n  observer.observe(document.body, {\n    childList: true,\n    subtree: true,\n  });\n}\n\n/**\n * Overrides BazaarVoice's default scroll behavior on the inline rating button\n * BazaarVoice's injected JS scrolls to the reviews block, but doesn't account\n * for the sticky header (79px), causing the content to scroll too far down\n */\nfunction initBazaarVoiceScroll() {\n  let lastScrollTime = 0;\n\n  // Function to handle the custom scroll with header offset\n  const handleRatingButtonClick = (event) => {\n    // Prevent duplicate execution when both touch and click events fire\n    const now = Date.now();\n    if (now - lastScrollTime < 500) {\n      return;\n    }\n    lastScrollTime = now;\n\n    // Find the reviews container to scroll to\n    const reviewsContainer = document.querySelector('.block--bazaarvoice-reviews');\n\n    if (reviewsContainer) {\n      // Prevent BazaarVoice's default scroll behavior\n      event.preventDefault();\n      event.stopPropagation();\n\n      // Get the sticky header height dynamically\n      const header = document.querySelector('.js-header');\n      const headerHeight = header ? header.getBoundingClientRect().height : 79;\n\n      // Calculate the position accounting for the sticky header\n      const elementPosition = reviewsContainer.getBoundingClientRect().top;\n      const offsetPosition = elementPosition + window.pageYOffset - headerHeight;\n\n      // Smooth scroll to the correct position\n      window.scrollTo({\n        top: offsetPosition,\n        behavior: 'smooth'\n      });\n    }\n  };\n\n  // Wait for BazaarVoice to inject the rating button\n  const attachScrollHandler = () => {\n    const ratingButton = document.querySelector('.bv_main_rating_button');\n\n    if (ratingButton && !ratingButton.dataset.scrollOverrideAttached) {\n      // Mark as handled to avoid duplicate listeners\n      ratingButton.dataset.scrollOverrideAttached = 'true';\n\n      // Attach both touch and click handlers - use capture phase to intercept before BV's handler\n      // Touch events fire first on mobile, so we catch those before BV's handlers\n      ratingButton.addEventListener('touchstart', handleRatingButtonClick, true);\n      ratingButton.addEventListener('click', handleRatingButtonClick, true);\n    }\n  };\n\n  // Try to attach immediately if button already exists\n  attachScrollHandler();\n\n  // Otherwise, observe for when BazaarVoice injects the button\n  const buttonObserver = new MutationObserver(() => {\n    attachScrollHandler();\n  });\n\n  buttonObserver.observe(document.body, {\n    childList: true,\n    subtree: true,\n  });\n}\n","import { onDOMContentLoaded } from '../util/loaded';\nimport '../features/pdp/up-sell';\nimport { initTogglePayLater } from '../features/pdp/showcase';\nimport { initPositiveLuxuryMark } from '../features/positive-luxury-mark';\nimport { initToplPassport } from '../features/topl';\nimport { initBazaarVoice } from '../bazaar-voice';\nimport { initHarperPDPWidget } from '../features/harper';\nimport { lazyInitFlashSaleCountdown } from '../features/sale/lazy';\n\ninitPositiveLuxuryMark();\n\nonDOMContentLoaded(async () => {\n  initToplPassport();\n  initBazaarVoice();\n  lazyInitFlashSaleCountdown(document.body);\n  initTogglePayLater();\n\n  try {\n    const harper = await initHarperPDPWidget();\n\n    const pdpBtnElement = document.querySelector(harper.pdpBtnElement);\n    const harperWidget = document.querySelector('.product-details__harper-widget');\n\n    if (pdpBtnElement && harperWidget) {\n      const message = document.createElement('p');\n      message.className = 'product-details__harper-pdp-message';\n      message.innerHTML = '<strong>Try before you buy</strong> - selected areas';\n\n      pdpBtnElement.insertBefore(message, pdpBtnElement.firstChild);\n      harperWidget.style.display = 'inline-block';\n    }\n  } catch (e) {\n    if (e instanceof Error && e.message === 'Harper config not set') {\n      console.warn('Failed to initialise Harper PDP widget', e);\n    } else {\n      console.error('Failed to initialise Harper PDP widget', e);\n    }\n  }\n});\n","export const initToplPassport = () => {\n  let tray;\n\n  window.addEventListener('message', (event) => {\n    if (event.data && event.data.action === 'ennotrace-close') {\n      if ($.magnificPopup && $.magnificPopup.instance) {\n        $.magnificPopup.close();\n      }\n    }\n  });\n\n  document.body.addEventListener('click', function (e) {\n    const target = e.target.closest('.js-traceability-trigger, #js-traceability-mark');\n    if (!target) return;\n\n    e.preventDefault();\n\n    if (!tray) {\n      tray = document.createElement('div');\n      tray.className = 'topl-passport__tray mfp-hide popup popup--side popup--tight';\n\n      const frame = document.createElement('iframe');\n      frame.title = 'Traceability Journey Demo';\n      frame.width = '385px';\n      frame.height = '685px';\n      frame.src = target.getAttribute('href');\n\n      tray.appendChild(frame);\n\n      document.body.appendChild(tray);\n    }\n\n    header.setWidgetDepth();\n\n    $.magnificPopup.open({\n      type: 'inline',\n      items: {\n        src: '.topl-passport__tray',\n      },\n      removalDelay: 300,\n      mainClass: 'mfp-fade',\n      fixedContentPos: true,\n      callbacks: {\n        open: function () {\n          setTimeout(() => tray.classList.add('popup--open'), 200);\n        },\n        close: function () {\n          setTimeout(() => {\n            tray.classList.remove('popup--open');\n          }, 200);\n        }\n      }\n    });\n  });\n};\n","export const lazyInitFlashSaleCountdown = async (container) => {\n  if (!container.querySelector('.flash-badge.flash-badge--countdown')) {\n    return;\n  }\n\n  try {\n    const { initFlashSaleCountdown } = await import('./index.js');\n    initFlashSaleCountdown(container);\n  } catch (e) {\n    console.error('Failed to initialise flash sale countdown', e);\n  }\n};\n"],"names":["initBloomreachCarousel","$","each","async","i","container","$container","engineId","dataset","recEngineId","abortController","AbortController","abortAfterTimeout","signal","recommendations","getRecommendations","relatedProducts","recEngineProducts","JSON","parse","maxRecommendationCount","cardHTML","loadProductCards","modifiers","length","contentElement","querySelector","innerHTML","parentNode","style","width","title","prev","find","toReposition","push","carousel","querySelectorAll","forEach","card","setAttribute","addEventListener","e","target","classList","contains","exponea","track","action","item_id","gaid","recommendation_id","this","add","gallery","Carousel","arrows","dots","infinite","variableWidth","appendArrows","closest","slidesToShow","slidesToScroll","touchThreshold","draggable","responsive","breakpoint","settings","swipe","swipeToSlide","initUpgradeSwatches","cards","document","children","list","items","MV","tracking","productElementClick","position","getProductElementData","impressProducts","init","console","log","display","swatches","window","pdp","upgradeSwatches","sw","ProductSwatchGroup","elem","_getTrackingPageType","link","controller","article","galabel","getData","price","href","imageUrl","hoverUrl","cnstrcItemVariationId","cnstrcItemPrice","swatchGroupImage","src","srcset","swatchGroupHover","textContent","wasPrice","discount","createElement","append","prepend","remove","err","trackProductListImpressions","getTrackingPageType","element","gaBlockType","debug","upgradeBlock","_getTrackingPageType2","entries","trackProductElementClick","initialSlide","upsellBlock","_getTrackingPageType3","loadScript","once","Promise","resolve","js","id","onload","setTimeout","plPassportHelper","body","initBazaarVoice","cssContent","injectStyles","shadowRoot","appendChild","widget","MutationObserver","mutations","obs","disconnect","observe","childList","subtree","initBazaarVoiceStyles","setupShadowRootObserver","pollInterval","clearInterval","setInterval","initBazaarVoiceSubmissionStyles","lastScrollTime","handleRatingButtonClick","event","now","Date","reviewsContainer","preventDefault","stopPropagation","header","headerHeight","getBoundingClientRect","height","offsetPosition","top","pageYOffset","scrollTo","behavior","attachScrollHandler","ratingButton","scrollOverrideAttached","initBazaarVoiceScroll","brandId","mode","type","floating","colorScheme","align","error","initPositiveLuxuryMark","onDOMContentLoaded","initToplPassport","tray","data","magnificPopup","instance","close","className","frame","getAttribute","setWidgetDepth","open","removalDelay","mainClass","fixedContentPos","callbacks","initFlashSaleCountdown","import","lazyInitFlashSaleCountdown","initTogglePayLater","trigger","separator","harper","initHarperPDPWidget","pdpBtnElement","harperWidget","message","insertBefore","firstChild","Error","warn"],"mappings":"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"}