{"version":3,"file":"listing.js","names":[],"sources":["../node_modules/@d3r/js-tools/src/utils/dynamic-select.js","../resources/modern-javascript/listing.js"],"sourcesContent":["/**\n * Dynamically sets the width of a select element based on the width of the\n * currently selected option text.\n *\n * Returns a cleanup function that removes the change event listener.\n *\n * @param {HTMLSelectElement} selectEl - The select element to resize\n * @param {object} [options] - Configuration options\n * @param {string} [options.parentSelector] - Optional parent selector to also resize\n * @returns {Function|undefined} Cleanup function to remove the event listener\n *\n * @example\n * import { setDynamicSelectSize } from '@d3r/js-tools';\n *\n * const select = document.querySelector('[data-resizing-select]');\n * const cleanup = setDynamicSelectSize(select);\n *\n * // Later, to remove the listener:\n * cleanup();\n *\n * // With a parent selector to also resize\n * setDynamicSelectSize(select, { parentSelector: '.select-wrapper' });\n */\nexport default function setDynamicSelectSize(selectEl, options = {}) {\n    if (!selectEl) {\n        return;\n    }\n\n    const { parentSelector } = options;\n\n    const getTextWidth = (text, font) => {\n        const span = document.createElement('span');\n        span.textContent = text;\n        span.style.position = 'absolute';\n        span.style.visibility = 'hidden';\n        span.style.whiteSpace = 'nowrap';\n        span.style.font = font;\n        document.body.appendChild(span);\n\n        const width = Math.ceil(span.getBoundingClientRect().width);\n        span.remove();\n\n        return width;\n    };\n\n    const getFontStyle = el => {\n        const style = window.getComputedStyle(el);\n        return `${style.fontStyle} ${style.fontWeight} ${style.fontSize} ${style.fontFamily}`;\n    };\n\n    const getExtraWidth = el => {\n        const style = window.getComputedStyle(el);\n        return (\n            parseFloat(style.paddingLeft) +\n            parseFloat(style.paddingRight) +\n            parseFloat(style.borderLeftWidth) +\n            parseFloat(style.borderRightWidth)\n        );\n    };\n\n    const updateSize = () => {\n        const selectedText =\n            selectEl.options[selectEl.selectedIndex]?.text ?? '';\n        const font = getFontStyle(selectEl);\n        const textWidth = getTextWidth(selectedText, font);\n        const extra = getExtraWidth(selectEl);\n\n        const totalWidth = textWidth + extra;\n\n        selectEl.style.width = `${totalWidth}px`;\n\n        if (parentSelector) {\n            const parentElement = selectEl.closest(parentSelector);\n            if (parentElement) {\n                parentElement.style.width = `${totalWidth}px`;\n            }\n        }\n    };\n\n    updateSize();\n    selectEl.addEventListener('change', updateSize);\n\n    return () => selectEl.removeEventListener('change', updateSize);\n}\n","import { setDynamicSelectSize } from '@d3r/js-tools';\n\nconst listingElement = document.querySelector('.js-listing');\nconst listingItems = document.querySelector('#listing-items');\nconst listingPagination = document.querySelector('#listing-pagination');\nconst listingPreviousPagination = document.querySelector('.js-listing-pagination-previous');\nconst listingViewPrevious = document.querySelector('.js-listing-view-previous');\nconst listingSort = document.querySelector('.filterable__option--sort select');\nconst listingPageStates = new Map();\nconst listingSnapshotPointerKey = 'sohoListingViewMoreSnapshotKey';\nlet removeListingSortSize = null;\n\nif (listingSort) {\n    Soho.filterable.addField('sort', new Filters.Fields.Select('.filterable__option--sort'));\n}\n\nconst resizeListingSort = () => {\n    if (!listingSort) {\n        return;\n    }\n\n    if (typeof removeListingSortSize === 'function') {\n        removeListingSortSize();\n    }\n\n    removeListingSortSize = setDynamicSelectSize(listingSort);\n};\n\nvar listing = new Listing(listingElement, {\n    hrefs: [],\n    plugins: [\n        Soho.filterable\n    ]\n});\n\nlistingElement.removeAttribute('data-data');\n\nlet loadedStartRow = Number(listingElement.dataset.startRow);\nlet loadedEndRow = Number(listingElement.dataset.endRow);\nlet pageRequest = null;\n\nconst getPageFromState = state => {\n    try {\n        return Number(JSON.parse(state?.raw).payload.data.page);\n    } catch (error) {\n        return null;\n    }\n};\n\nconst rememberPageState = (page, state) => {\n    page = Number(page);\n\n    if (page && state?.raw) {\n        listingPageStates.set(page, {\n            url: state.url,\n            raw: state.raw\n        });\n    }\n};\n\nconst getLoadedPages = () => Array.from(listingPageStates.keys())\n    .map(Number)\n    .filter(Boolean)\n    .sort((a, b) => a - b);\n\nconst getPageUrl = (page, sourceUrl = window.location.href) => {\n    const url = new URL(sourceUrl, window.location.origin);\n\n    if (Number(page) > 1) {\n        url.searchParams.set('page', page);\n    } else {\n        url.searchParams.delete('page');\n    }\n\n    return url.href;\n};\n\nconst syncViewPrevious = () => {\n    if (!listingPreviousPagination || !listingViewPrevious) {\n        return;\n    }\n\n    const firstPage = getLoadedPages()[0];\n    const firstPageState = listingPageStates.get(firstPage);\n    const hasPreviousPage = loadedStartRow > 1 && firstPage > 1 && firstPageState?.url;\n\n    listingPreviousPagination.hidden = !hasPreviousPage;\n\n    if (hasPreviousPage) {\n        listingViewPrevious.href = getPageUrl(firstPage - 1, firstPageState.url);\n    }\n};\n\nconst markProductLinks = page => {\n    page = Number(page);\n\n    if (!page) {\n        return;\n    }\n\n    for (const link of listingItems.querySelectorAll('a.product__link[data-sku]')) {\n        link.dataset.listingPage = page;\n    }\n};\n\nconst initialPage = getPageFromState(window.history.state);\n\nrememberPageState(initialPage, window.history.state);\nmarkProductLinks(initialPage);\nsyncViewPrevious();\n\nlisting.addEventListener(Listing.Events.UPDATING, function(e) {\n    var url = e.detail.request.url;\n\n    if (!url.searchParams.has('limit')) {\n        var currentUrl = new URL(window.location.href);\n        if (currentUrl.searchParams.has('limit')) {\n            url.searchParams.set('limit', currentUrl.searchParams.get('limit'));\n        }\n    }\n\n    if (url.searchParams.has('sort') && url.searchParams.get('sort') == 'featured') {\n        url.searchParams.delete('sort');\n    }\n    if (url.searchParams.has('sort') && url.searchParams.get('sort') == 'relevance') {\n        url.searchParams.delete('sort');\n    }\n\n    const searchInput = document.querySelector('input[name=q][type=hidden]');\n    if (searchInput && !url.searchParams.has('q')) {\n        url.searchParams.set('q', searchInput.getAttribute('value'));\n    }\n});\n\nlisting.addEventListener(Listing.Events.UPDATED, function(e) {\n    if (!e.detail.reload) {\n        window.scroll(0, 0);\n    }\n\n    const payload = e.detail.response.json.payload;\n    const data = payload.data;\n\n    if (!pageRequest) {\n        listingPageStates.clear();\n    }\n\n    rememberPageState(data.page, e.detail.response.state);\n\n    markProductLinks(data.page);\n\n    if (listingSort) {\n        const responseUrl = new URL(e.detail.response.url, window.location.origin);\n        const responseSort = responseUrl.searchParams.get('sort') || listingSort.options[0]?.value;\n        const hasResponseSort = Array.from(listingSort.options).some(option => option.value === responseSort);\n\n        if (hasResponseSort && listingSort.value !== responseSort) {\n            listingSort.value = responseSort;\n            resizeListingSort();\n        }\n    }\n\n    Soho.filters.updateAfterListingUpdated(payload)\n\n    window.recordProductImpressions(data.startRow);\n\n    if (typeof window.D3R?.InitHotspots === 'function') {\n        window.D3R.InitHotspots()\n    }\n\n    if (pageRequest) {\n        const firstNewProductLink = listingItems.querySelector('a.product__link[data-sku]');\n        const fragment = document.createDocumentFragment();\n\n        for (const node of pageRequest.items) {\n            fragment.appendChild(node);\n        }\n\n        if (pageRequest.direction === 'previous') {\n            listingItems.appendChild(fragment);\n\n            if (listingPagination) {\n                listingPagination.innerHTML = pageRequest.pagination;\n            }\n\n            loadedStartRow = Number(data.startRow);\n            listingElement.dataset.startRow = loadedStartRow;\n\n            const currentAnchorTop = pageRequest.scrollAnchor?.getBoundingClientRect().top;\n\n            if (Number.isFinite(currentAnchorTop) && Number.isFinite(pageRequest.scrollAnchorTop)) {\n                window.scrollBy(0, currentAnchorTop - pageRequest.scrollAnchorTop);\n            }\n        } else {\n            listingItems.insertBefore(fragment, listingItems.firstChild);\n\n            loadedEndRow = Number(data.endRow);\n            listingElement.dataset.endRow = loadedEndRow;\n        }\n\n        if (pageRequest.focusNewItems && firstNewProductLink) {\n            firstNewProductLink.focus({ preventScroll: true });\n        }\n    } else {\n        loadedStartRow = Number(data.startRow);\n        loadedEndRow = Number(data.endRow);\n        listingElement.dataset.startRow = loadedStartRow;\n        listingElement.dataset.endRow = loadedEndRow;\n    }\n\n    syncViewPrevious();\n});\n\nlisting.addEventListener(Listing.Events.COMPLETE, function(e) {\n    const data = e.detail.response.json.payload.data;\n\n    if (!pageRequest || !e.detail.reload) {\n        return;\n    }\n\n    const currentPageState = listingPageStates.get(Number(data.page));\n\n    const state = Object.assign({}, currentPageState, {\n        listingViewMore: {\n            startRow: loadedStartRow,\n            endRow: loadedEndRow,\n            page: data.page,\n            limit: data.limit\n        }\n    });\n\n    window.history.replaceState(state, null, currentPageState.url);\n    pageRequest = null;\n});\n\nlisting.addEventListener(Listing.Events.ERROR, function() {\n    pageRequest = null;\n});\n\nlistingElement.addEventListener('click', function(e) {\n    const previousLink = e.target.closest('.js-listing-view-previous');\n    const nextLink = e.target.closest('.js-listing-view-more');\n    const link = previousLink || nextLink;\n\n    if (!link) {\n        return;\n    }\n\n    e.preventDefault();\n\n    if (pageRequest || listingElement.dataset.loading === 'true') {\n        return;\n    }\n\n    const scrollAnchor = previousLink && e.detail !== 0\n        ? listingItems.firstElementChild\n        : null;\n\n    pageRequest = {\n        direction: previousLink ? 'previous' : 'next',\n        items: Array.from(listingItems.children),\n        focusNewItems: e.detail === 0,\n        pagination: listingPagination?.innerHTML || '',\n        scrollAnchor,\n        scrollAnchorTop: scrollAnchor?.getBoundingClientRect().top\n    };\n\n    listing.navigate(link.href, true);\n});\n\nconst storeListingSnapshot = () => {\n    const key = `sohoListingViewMoreSnapshot:${Date.now()}:${Math.random().toString(36).slice(2)}`;\n    const snapshot = JSON.stringify({\n        version: 2,\n        url: window.location.href,\n        pages: getLoadedPages().map(page => ({\n            page,\n            state: listingPageStates.get(page)\n        })),\n        pagination: listingPagination?.innerHTML || '',\n        startRow: loadedStartRow,\n        endRow: loadedEndRow\n    });\n\n    try {\n        const previousKey = window.sessionStorage.getItem(listingSnapshotPointerKey);\n\n        if (previousKey) {\n            window.sessionStorage.removeItem(previousKey);\n        }\n\n        window.sessionStorage.setItem(key, snapshot);\n        window.sessionStorage.setItem(listingSnapshotPointerKey, key);\n\n        return key;\n    } catch (error) {\n        try {\n            window.sessionStorage.removeItem(key);\n        } catch (storageError) {\n            // The page-only fallback below does not depend on web storage.\n        }\n\n        return null;\n    }\n};\n\nlistingItems.addEventListener('click', function(e) {\n    const link = e.target.closest('a.product__link[data-sku]');\n\n    if (!link || !window.history.state?.raw) {\n        return;\n    }\n\n    const currentState = window.history.state;\n    const sourcePage = Number(link.dataset.listingPage) || getPageFromState(currentState);\n    const latestPage = Number(currentState.listingViewMore?.page) || getPageFromState(currentState);\n    const snapshotKey = storeListingSnapshot();\n    const productLinks = Array.from(listingItems.querySelectorAll('a.product__link[data-sku]'));\n    const anchor = {\n        sku: link.dataset.sku,\n        href: link.href,\n        productIndex: productLinks.indexOf(link),\n        sourcePage,\n        latestPage,\n        latestUrl: window.location.href,\n        viewportTop: link.getBoundingClientRect().top,\n        scrollY: window.scrollY,\n        snapshotKey,\n        pageOnlyFallback: false\n    };\n    let state = currentState;\n    let stateUrl = window.location.href;\n\n    if (!snapshotKey && sourcePage !== latestPage && listingPageStates.has(sourcePage)) {\n        const sourcePageState = listingPageStates.get(sourcePage);\n\n        state = sourcePageState;\n        stateUrl = getPageUrl(sourcePage, sourcePageState.url);\n        anchor.pageOnlyFallback = true;\n    }\n\n    state = Object.assign({}, state, {\n        listingViewMore: currentState.listingViewMore,\n        listingAnchor: anchor\n    });\n\n    window.history.replaceState(state, null, stateUrl);\n}, true);\n\nconst isBackForwardNavigation = () => {\n    const navigation = window.performance.getEntriesByType?.('navigation')?.[0];\n\n    if (navigation) {\n        return navigation.type === 'back_forward';\n    }\n\n    return window.performance.navigation?.type === window.performance.navigation?.TYPE_BACK_FORWARD;\n};\n\nconst restoreListingSnapshot = anchor => {\n    if (!anchor.snapshotKey) {\n        return false;\n    }\n\n    try {\n        const storedSnapshot = window.sessionStorage.getItem(anchor.snapshotKey);\n        const snapshot = storedSnapshot ? JSON.parse(storedSnapshot) : null;\n\n        if (\n            !snapshot\n            || snapshot.version !== 2\n            || snapshot.url !== anchor.latestUrl\n            || !Array.isArray(snapshot.pages)\n            || snapshot.pages.length === 0\n        ) {\n            return false;\n        }\n\n        const items = document.createDocumentFragment();\n\n        listingPageStates.clear();\n\n        for (const pageSnapshot of snapshot.pages) {\n            const response = JSON.parse(pageSnapshot.state.raw);\n            const body = response.payload?.live?.body;\n\n            if (typeof body !== 'string') {\n                return false;\n            }\n\n            const template = document.createElement('template');\n\n            template.innerHTML = body;\n\n            for (const link of template.content.querySelectorAll('a.product__link[data-sku]')) {\n                link.dataset.listingPage = pageSnapshot.page;\n            }\n\n            items.appendChild(template.content);\n            rememberPageState(pageSnapshot.page, pageSnapshot.state);\n        }\n\n        listingItems.replaceChildren(items);\n\n        if (listingPagination) {\n            listingPagination.innerHTML = snapshot.pagination;\n        }\n\n        loadedStartRow = Number(snapshot.startRow);\n        loadedEndRow = Number(snapshot.endRow);\n        listingElement.dataset.startRow = loadedStartRow;\n        listingElement.dataset.endRow = loadedEndRow;\n\n        if (typeof window.D3R?.InitHotspots === 'function') {\n            window.D3R.InitHotspots();\n        }\n\n        return true;\n    } catch (error) {\n        return false;\n    }\n};\n\nconst restoreBoundedPageState = () => {\n    const page = getPageFromState(window.history.state);\n\n    loadedStartRow = Number(listingElement.dataset.startRow);\n    loadedEndRow = Number(listingElement.dataset.endRow);\n    listingPageStates.clear();\n    rememberPageState(page, window.history.state);\n    markProductLinks(page);\n};\n\nconst restoreLatestBfcacheState = anchor => {\n    if (!anchor.pageOnlyFallback || !anchor.latestUrl || !listingPageStates.has(anchor.latestPage)) {\n        return;\n    }\n\n    const state = Object.assign({}, listingPageStates.get(anchor.latestPage), {\n        listingViewMore: window.history.state?.listingViewMore,\n        listingAnchor: Object.assign({}, anchor, {\n            pageOnlyFallback: false\n        })\n    });\n\n    window.history.replaceState(state, null, anchor.latestUrl);\n};\n\nconst findAnchorLink = anchor => {\n    const links = Array.from(listingItems.querySelectorAll('a.product__link[data-sku]'));\n    const indexedLink = links[anchor.productIndex];\n\n    if (\n        indexedLink\n        && indexedLink.dataset.sku === anchor.sku\n        && indexedLink.href === anchor.href\n    ) {\n        return indexedLink;\n    }\n\n    return links.find(link => (\n        link.dataset.sku === anchor.sku\n        && link.href === anchor.href\n    ));\n};\n\nconst restoreAnchorPosition = anchor => {\n    const alignAnchor = () => {\n        const link = findAnchorLink(anchor);\n\n        if (!link) {\n            return;\n        }\n\n        const viewportTop = Number(anchor.viewportTop);\n\n        if (Number.isFinite(viewportTop)) {\n            const targetScrollY = window.scrollY + link.getBoundingClientRect().top - viewportTop;\n\n            window.scrollTo(0, Math.max(0, targetScrollY));\n        } else {\n            link.scrollIntoView({ block: 'center' });\n        }\n    };\n\n    window.requestAnimationFrame(() => {\n        window.requestAnimationFrame(() => {\n            alignAnchor();\n            window.requestAnimationFrame(alignAnchor);\n            window.setTimeout(alignAnchor, 250);\n        });\n    });\n};\n\nwindow.addEventListener('pageshow', function(e) {\n    const anchor = window.history.state?.listingAnchor;\n\n    if (!anchor || (!e.persisted && !isBackForwardNavigation())) {\n        return;\n    }\n\n    if (e.persisted) {\n        restoreLatestBfcacheState(anchor);\n    } else if (!restoreListingSnapshot(anchor)) {\n        restoreBoundedPageState();\n    }\n\n    syncViewPrevious();\n    restoreAnchorPosition(anchor);\n});\n\nwindow.recordProductImpressions = function(start, list) {\n    Soho.GTM.recordProductImpressions(start, list);\n};\n\nSoho.GTM.listenForProductClicks('listing-items');\n\n\ndocument.addEventListener('DOMContentLoaded', () => {\n    Soho.setDynamicSelectSize = setDynamicSelectSize;\n\n    resizeListingSort();\n});\n"],"x_google_ignoreList":[0],"mappings":"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"}