{"version":3,"mappings":"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","names":["controllers","dialogSelector","initDialogScrollLock","doc","view","fixedPage","root","lock","owners","properties","release","previous","value","priority","index","property","behavior","sync","x","y","scrollbar","observer","owner","records","record","node","stateObserver","dispose","STICKY_HEADER_DIRECTION_DISTANCE","STICKY_HEADER_INITIAL_VISIBILITY_MS","STICKY_HEADER_HIDE_BOUNDARY_SELECTOR","initSiteHeader","desktopQuery","main","header","utility","navigation","navigationRows","search","lastScrollY","mainHeight","utilityHeight","navigationHeight","shortLandscape","upwardScrollDistance","downwardScrollDistance","delayNextHide","hideTimer","frame","measurementRequested","layoutReady","hideBoundaries","hideBoundariesDirty","preserveInitialHeader","hasScrollInput","normalSearchTop","stickySearchTop","publishLayout","initHeaderLayout","clearHideTimer","reset","hideWhenReady","hide","scrollY","hideAfter","currentScrollY","getHideBoundaries","boundary","element","getHideBoundaryState","canHide","boundaries","stickyHeaderBottom","state","includeNormalBoundaries","bounds","top","measure","nextShortLandscape","navigationHeights","row","primaryNavigationHeight","height","rowHeight","searchHeight","setProperty","name","applyMeasurement","searchInset","prepareUpdate","delta","menuIsOpen","measurement","stickyStart","isManaged","isVisible","couldRevealOnUpwardScroll","boundaryState","fullBoundaryBlocksHeader","reachedHideBoundary","intersectsHideBoundary","menuOverlayTop","update","requestUpdate","requestMeasurement","rememberScrollInput","event","type","resizeObserver","createLayoutObserver","initCountrySwitcher","switchers","menu","switcher","updateMobilePanelHeight","availableHeight","options","other","form","list","selected","flag","optionFlag","label","button","response","openSwitcher","openOptions","createMegaMenuInput","mouseInputQuery","clickPointerTypes","pendingPointer","trigger","pointerType","megaMenuModule","initializedHeaders","loadMegaMenu","__vitePreload","error","initMegaMenuOnDemand","triggers","initialization","ready","inputForTrigger","initialize","initMegaMenu","usesMouseOrKeyboard","replayPointerType","initAlgoliaSearch","container","loading","opening","load","initSearch","openLoadedSearch","open","opener","initBackToTop","reducedMotion","visible","scheduleUpdate","nextVisible","focusWithoutScroll","marker","entry","cartEventNames","cartActionSelector","initCartFeedbackOnDemand","modulePromise","initializationPromise","stylesheetAttempts","controller","pendingEvents","reportedFailures","retryStylesheet","match","url","resume","resolve","link","timer","fail","cleanup","reject","loadModule","reportFailure","feedback","eventName","fieldSelector","connectServerErrors","wrapperSelector","style","wrapper","fields","field","baseId","id","suffix","describedBy","visibleInvalidField","initFormUsability","focusScheduled","updateValidity","sourceContext","placement","initializedRoots","observedRowGroups","observedCommerce","observedCards","pendingRowGroups","rowGroupResizeObserver","rowAlignmentFrame","productCardRowGroups","groups","containingGroup","group","productCardsInGroup","item","card","alignProductCardRowGroups","assignments","items","commerce","slot","rail","columns","rows","position","tallest","releaseObservedProductCard","releaseProductCardRowGroup","syncProductCardRowGroup","current","flushProductCardRowAlignment","scheduleProductCardRowAlignment","observedBorderBoxSize","borderBox","size","horizontal","total","edge","observeProductCardRowGroup","entries","commerceItem","key","width","mutationObserver","alignProductCardRows","initialized","updateShippingNotes","summary","threshold","note","productAmount","standardAmount","loadDeferredSlide","image","slide","src","srcset","sizes","updateGalleryPage","pages","gallery","isActive","activeIndex","page","selectGalleryPage","slides","moveGalleryByKeyboard","slider","getBlazeSlider","currentIndex","nextIndex","direction","removeBrokenAdditionalSlide","failedIndex","remainingPages","pagination","remainingPage","refreshBlazeSlider","showAddError","showCartAddError","addProduct","productId","quantity","requestBody","optionId","optionValue","originalLabel","result","toggleCardWishlist","change","toggleWishlist","initProductCards","getCartSummary","content","galleryPage","addButton","wishlistButton","alignAfterFonts","fonts","preparedRails","loadDragScroll","n","initDragScrollOnDemand","initDragScroll","bind","CANDIDATE_ATTRIBUTE","PREDICTED_ATTRIBUTE","SKIP_ATTRIBUTE","PREFETCH_REACTIVATE_MS","REGISTRATION_BATCH_SIZE","REGISTRATION_BUDGET_MS","candidateSelector","sensitiveRoutePrefixes","unsupportedDocumentRoutes","sensitiveRouteActions","sensitiveQueryParameters","sensitivePathPattern","downloadablePathPattern","foresightManager","foresightLoadPromise","speculationRulesSupported","prefetchedUrls","reactivatingUrls","registeredLinks","pendingRegistrations","observedRegistrationLinks","registrationObserver","registrationScheduled","backgroundWorkShouldBeSkipped","connection","supportsSpeculationRules","supports","normalizedNavigationKey","comparable","hasSensitiveRoute","route","prefix","part","isEligibleLink","href","parameter","candidateLinks","links","addSpeculationRules","script","rules","prefetchWithForesight","existing","registration","registeredLink","activate","currentUrl","refreshLink","unregisterStaleLinks","registeredUrls","registerLink","flushRegistrations","started","processed","deadline","scheduleRegistrations","scheduleWhenIdle","stopObservingRegistration","queueRegistration","scanLinks","observeLinkChanges","registrationsMayHaveChanged","mutations","target","attributeName","removedNodes","addedNodes","callback","loadForesight","ForesightManager","installLowPriorityLoadTriggers","schedule","registerInteractedLink","initNavigationPrefetch","cache","initProductRatingPopover","popover","activeTrigger","showTimer","generation","touchShouldOpen","positionFrame","anchor","popoverSize","scheduleHide","measureAnchor","applyPosition","left","rect","viewportWidth","preferredTop","viewportHeight","ensurePopover","box","show","rawUrl","currentGeneration","panel","pending","html","scheduleShow","initLastviewedLogger","logged","initializationPending","initializationFinished","logProductView","config","endpoint","body","initCartState","initStorefrontTracking","initBlazeSliders","initVideoVariants","openPriceHistory","saved"],"ignoreList":[],"sources":["../../template/components/common/dialog-scroll-lock/dialog-scroll-lock.js","../../template/components/home/site-header/site-header.js","../../template/components/home/country-switcher/country-switcher.js","../../template/components/home/mega-menu/mega-menu-input.js","../../template/components/home/mega-menu/mega-menu-loader.js","../../template/components/common/algolia-search/algolia-search.js","../../template/components/common/back-to-top/back-to-top.js","../../template/components/common/cart-feedback/cart-feedback-loader.js","../../template/components/common/form-usability/form-usability.js","../../template/components/product-card/product-card.js","../../template/components/common/drag-scroll/drag-scroll-loader.js","../../template/components/common/navigation-prefetch/navigation-prefetch.js","../../template/components/common/product-rating-popover/product-rating-popover.js","../../template/components/common/lastviewed/lastviewed.js","../../src/shared.js"],"sourcesContent":["const controllers = new WeakMap();\nconst dialogSelector = 'dialog.z-modal[open]';\n\n/** Native dialogs do not lock backdrop scrolling; older Safari also needs a fixed page. */\nexport function initDialogScrollLock(doc = document) {\n    if (controllers.has(doc)) return controllers.get(doc);\n    const view = doc.defaultView;\n    if (!view || !doc.body) return;\n    const fixedPage = !view.CSS?.supports('overscroll-behavior', 'contain');\n    const root = doc.documentElement;\n    let lock;\n    let owners = [];\n    const properties = ['--z-scroll-lock-top', '--z-scroll-lock-left', '--z-scroll-lock-width'];\n\n    function release() {\n        if (!lock) return;\n        const previous = lock;\n        lock = undefined;\n        root.classList.remove('z-page-scroll-lock', 'z-page-scroll-lock--fixed');\n        properties.forEach((property, index) => {\n            const [value, priority] = previous.styles[index];\n            if (value) root.style.setProperty(property, value, priority);\n            else root.style.removeProperty(property);\n        });\n        const behavior = root.style.getPropertyValue('scroll-behavior');\n        const priority = root.style.getPropertyPriority('scroll-behavior');\n        root.style.setProperty('scroll-behavior', 'auto');\n        view.scrollTo(previous.x, previous.y);\n        if (behavior) root.style.setProperty('scroll-behavior', behavior, priority);\n        else root.style.removeProperty('scroll-behavior');\n    }\n\n    function sync() {\n        owners = [...doc.querySelectorAll(dialogSelector)];\n        if (root.classList.contains('show--preferences')) owners.push(root);\n        if (doc.body.classList.contains('aa-Detached')) owners.push(doc.body);\n        if (!owners.length) {\n            // An engraving overlay may outlive the native dialog beneath it.\n            if (lock && doc.body.style.position === 'fixed') return;\n            release();\n            return;\n        }\n        // Respect an existing fixed-body lock, including the engraving editor.\n        if (lock || view.getComputedStyle(doc.body).position === 'fixed') return;\n        const x = view.scrollX;\n        const y = view.scrollY;\n        const scrollbar = Math.max(0, view.innerWidth - root.clientWidth);\n        lock = {\n            x,\n            y,\n            styles: properties.map((property) => [\n                root.style.getPropertyValue(property),\n                root.style.getPropertyPriority(property),\n            ]),\n        };\n        root.style.setProperty(properties[0], `${-y}px`);\n        root.style.setProperty(properties[1], `${-x}px`);\n        root.style.setProperty(properties[2], `calc(100% - ${scrollbar}px)`);\n        root.classList.add('z-page-scroll-lock');\n        root.classList.toggle('z-page-scroll-lock--fixed', fixedPage);\n    }\n\n    const observer = new view.MutationObserver((records) => {\n        if (\n            owners.some((owner) => !owner.isConnected) ||\n            records.some((record) => {\n                if (record.type === 'attributes')\n                    return (\n                        record.target === root ||\n                        record.target === doc.body ||\n                        record.target.matches('dialog.z-modal')\n                    );\n                return [...record.addedNodes, ...record.removedNodes].some(\n                    (node) =>\n                        node.nodeType === 1 &&\n                        (node.matches('dialog.z-modal') || node.querySelector(dialogSelector)),\n                );\n            })\n        )\n            sync();\n    });\n    observer.observe(doc.body, {\n        attributes: true,\n        attributeFilter: ['open'],\n        childList: true,\n        subtree: true,\n    });\n    const stateObserver = new view.MutationObserver(sync);\n    stateObserver.observe(root, { attributes: true, attributeFilter: ['class'] });\n    stateObserver.observe(doc.body, { attributes: true, attributeFilter: ['class', 'style'] });\n    doc.addEventListener('close', sync, true);\n    view.addEventListener('cc:onModalShow', sync);\n    view.addEventListener('cc:onModalHide', sync);\n    const dispose = () => {\n        observer.disconnect();\n        stateObserver.disconnect();\n        doc.removeEventListener('close', sync, true);\n        view.removeEventListener('cc:onModalShow', sync);\n        view.removeEventListener('cc:onModalHide', sync);\n        release();\n        controllers.delete(doc);\n    };\n    controllers.set(doc, dispose);\n    sync();\n    return dispose;\n}\n","import { initHeaderLayout } from '../../common/header-layout/header-layout.js';\nimport { createLayoutObserver } from '../../common/layout-observer/layout-observer.js';\n\nconst STICKY_HEADER_DIRECTION_DISTANCE = 15;\nconst STICKY_HEADER_INITIAL_VISIBILITY_MS = 1000;\nconst STICKY_HEADER_HIDE_BOUNDARY_SELECTOR = '[data-sticky-header-hide]';\n\nexport function initSiteHeader(header) {\n    const desktopQuery = window.matchMedia('(min-width: 72rem)');\n    const main = header.querySelector('.z-site-header__main-frame');\n    const utility = header.querySelector('.z-site-header__utility');\n    const navigation = header.querySelector('.z-site-header__navigation-bar');\n    const navigationRows = [...header.querySelectorAll('.z-site-header__navigation-bar')];\n    const search = header.querySelector('.z-site-header__search');\n    let lastScrollY = null;\n    let mainHeight = 0;\n    let utilityHeight = 0;\n    let navigationHeight = 0;\n    let shortLandscape = false;\n    let upwardScrollDistance = 0;\n    let downwardScrollDistance = 0;\n    let delayNextHide = true;\n    let hideTimer = 0;\n    let frame = 0;\n    let measurementRequested = true;\n    let layoutReady = false;\n    let hideBoundaries = [];\n    let hideBoundariesDirty = true;\n    let preserveInitialHeader = ['reload', 'back_forward'].includes(\n        performance.getEntriesByType('navigation')[0]?.type,\n    );\n    let hasScrollInput = false;\n    let normalSearchTop = 0;\n    let stickySearchTop = 0;\n\n    if (!main) return;\n    const publishLayout = initHeaderLayout(header);\n\n    function clearHideTimer() {\n        window.clearTimeout(hideTimer);\n        hideTimer = 0;\n    }\n\n    function reset() {\n        clearHideTimer();\n        upwardScrollDistance = 0;\n        downwardScrollDistance = 0;\n        delayNextHide = true;\n        header.classList.remove('z-site-header--scroll-managed', 'z-site-header--scroll-visible');\n    }\n\n    function hideWhenReady(hideAfter, currentScrollY) {\n        if (hideTimer) return;\n\n        const hide = (scrollY) => {\n            hideTimer = 0;\n            if (\n                !header.hasAttribute('data-mega-menu-open') &&\n                scrollY >= hideAfter &&\n                downwardScrollDistance >= STICKY_HEADER_DIRECTION_DISTANCE\n            ) {\n                header.classList.remove('z-site-header--scroll-visible');\n                delayNextHide = false;\n            }\n        };\n\n        if (!delayNextHide || shortLandscape) hide(currentScrollY);\n        else\n            hideTimer = window.setTimeout(\n                () => hide(window.scrollY),\n                STICKY_HEADER_INITIAL_VISIBILITY_MS,\n            );\n    }\n\n    function getHideBoundaries() {\n        if (\n            hideBoundariesDirty ||\n            hideBoundaries.some((boundary) => !boundary.element.isConnected)\n        ) {\n            hideBoundariesDirty = false;\n            hideBoundaries = [\n                ...document.querySelectorAll(STICKY_HEADER_HIDE_BOUNDARY_SELECTOR),\n            ].map((element) => ({\n                element,\n                offset: Math.max(\n                    0,\n                    Number.parseFloat(element.dataset.stickyHeaderHideOffset || '0') || 0,\n                ),\n                full: element.hasAttribute('data-sticky-header-hide-full'),\n            }));\n        }\n\n        return hideBoundaries;\n    }\n\n    function getHideBoundaryState(currentScrollY, includeNormalBoundaries) {\n        const minimumScrollY = Math.ceil(utilityHeight + mainHeight + navigationHeight);\n        const canHide = currentScrollY >= minimumScrollY;\n        const boundaries = getHideBoundaries();\n        const stickyHeaderBottom = mainHeight + navigationHeight;\n        const state = { reached: false, intersects: false, fullIntersects: false };\n\n        for (const boundary of boundaries) {\n            if (boundary.full && preserveInitialHeader) continue;\n            if (!boundary.full && !includeNormalBoundaries) continue;\n            if (boundary.element.getClientRects().length === 0) continue;\n\n            const bounds = boundary.element.getBoundingClientRect();\n            const top = bounds.top + boundary.offset;\n            if (top > stickyHeaderBottom) continue;\n\n            state.reached ||= canHide;\n            if (boundary.full) {\n                if (canHide && bounds.bottom + boundary.offset >= 0) {\n                    state.fullIntersects = true;\n                    return state;\n                }\n            } else if (top >= 0) {\n                state.intersects = true;\n            }\n        }\n\n        return state;\n    }\n\n    function measure() {\n        const nextShortLandscape =\n            window\n                .getComputedStyle(header)\n                .getPropertyValue('--z-site-header-short-landscape')\n                .trim() === '1';\n        if (nextShortLandscape !== shortLandscape) clearHideTimer();\n        shortLandscape = nextShortLandscape;\n        mainHeight = main.getBoundingClientRect().height;\n        utilityHeight = utility?.getBoundingClientRect().height || 0;\n        const navigationHeights = desktopQuery.matches\n            ? navigationRows.map((row) => row.getBoundingClientRect().height)\n            : [];\n        const primaryNavigationHeight = navigationHeights[0] || 0;\n        navigationHeight = navigationHeights.reduce((height, rowHeight) => height + rowHeight, 0);\n        const searchHeight = search?.getBoundingClientRect().height || 48;\n        const searchInset = Math.max(0, (mainHeight - searchHeight) / 2 - 8);\n        return { primaryNavigationHeight, searchInset };\n    }\n\n    function setProperty(element, name, value) {\n        if (element.style.getPropertyValue(name) !== value) {\n            element.style.setProperty(name, value);\n        }\n    }\n\n    function applyMeasurement({ primaryNavigationHeight, searchInset }) {\n        const flowHeight = `${utilityHeight + mainHeight + navigationHeight}px`;\n        setProperty(header, '--z-site-header-flow-height', flowHeight);\n        setProperty(header, '--z-main-header-height', `${mainHeight}px`);\n        setProperty(header, '--z-primary-navigation-height', `${primaryNavigationHeight}px`);\n        const stickyHeaderHeight = `${mainHeight + navigationHeight}px`;\n        setProperty(header, '--z-sticky-header-height', stickyHeaderHeight);\n        normalSearchTop = utilityHeight + searchInset;\n        stickySearchTop = searchInset;\n        setProperty(header, '--z-algolia-search-normal-top', `${normalSearchTop}px`);\n        setProperty(header, '--z-algolia-search-sticky-top', `${stickySearchTop}px`);\n        publishLayout({\n            sticky: mainHeight + navigationHeight,\n            flow: utilityHeight + mainHeight + navigationHeight,\n        });\n    }\n\n    function prepareUpdate() {\n        frame = 0;\n        const currentScrollY = Math.max(0, window.scrollY);\n        const delta =\n            lastScrollY === null || preserveInitialHeader ? 0 : currentScrollY - lastScrollY;\n        const menuIsOpen = header.hasAttribute('data-mega-menu-open');\n        const measurement = measurementRequested ? measure() : null;\n        measurementRequested = false;\n        const stickyStart = Math.ceil(utilityHeight);\n        const downwardVisibilityDistance = shortLandscape ? 120 : desktopQuery.matches ? 375 : 300;\n        const hideAfter = stickyStart + downwardVisibilityDistance;\n        const isManaged = header.classList.contains('z-site-header--scroll-managed');\n        const isVisible = header.classList.contains('z-site-header--scroll-visible');\n        // Read boundary geometry before changing header classes or sizing variables.\n        const couldRevealOnUpwardScroll =\n            !menuIsOpen &&\n            !isVisible &&\n            isManaged &&\n            upwardScrollDistance + Math.max(0, -delta) >= STICKY_HEADER_DIRECTION_DISTANCE;\n        const boundaryState =\n            !menuIsOpen &&\n            (currentScrollY >= Math.ceil(utilityHeight + mainHeight + navigationHeight) ||\n                couldRevealOnUpwardScroll)\n                ? getHideBoundaryState(currentScrollY, delta > 0 || couldRevealOnUpwardScroll)\n                : null;\n        const fullBoundaryBlocksHeader = Boolean(boundaryState?.fullIntersects);\n        const reachedHideBoundary = delta > 0 && boundaryState?.reached;\n        const intersectsHideBoundary = couldRevealOnUpwardScroll && boundaryState?.intersects;\n        const menuOverlayTop = menuIsOpen\n            ? currentScrollY >= stickyStart\n                ? mainHeight + navigationHeight\n                : Math.max(0, header.getBoundingClientRect().bottom)\n            : null;\n\n        return () => {\n            if (measurement) applyMeasurement(measurement);\n\n            if (currentScrollY < stickyStart) {\n                reset();\n            } else {\n                if (!isManaged) header.classList.add('z-site-header--scroll-managed');\n\n                if (currentScrollY <= hideAfter) delayNextHide = true;\n\n                if (delta > 0) {\n                    upwardScrollDistance = 0;\n                    downwardScrollDistance =\n                        currentScrollY >= hideAfter\n                            ? downwardScrollDistance +\n                              currentScrollY -\n                              Math.max(currentScrollY - delta, hideAfter)\n                            : 0;\n                } else if (delta < 0) {\n                    clearHideTimer();\n                    downwardScrollDistance = 0;\n                    upwardScrollDistance += Math.abs(delta);\n                }\n\n                if (\n                    menuIsOpen ||\n                    (!fullBoundaryBlocksHeader &&\n                        (isVisible ||\n                            !isManaged ||\n                            (upwardScrollDistance >= STICKY_HEADER_DIRECTION_DISTANCE &&\n                                !intersectsHideBoundary)))\n                ) {\n                    if (!isVisible) header.classList.add('z-site-header--scroll-visible');\n                }\n\n                if (menuIsOpen) {\n                    clearHideTimer();\n                } else if (\n                    fullBoundaryBlocksHeader ||\n                    (delta > 0 &&\n                        header.classList.contains('z-site-header--scroll-visible') &&\n                        reachedHideBoundary)\n                ) {\n                    clearHideTimer();\n                    downwardScrollDistance = 0;\n                    delayNextHide = false;\n                    if (header.classList.contains('z-site-header--scroll-visible')) {\n                        header.classList.remove('z-site-header--scroll-visible');\n                    }\n                } else if (\n                    delta > 0 &&\n                    currentScrollY >= hideAfter &&\n                    downwardScrollDistance >= STICKY_HEADER_DIRECTION_DISTANCE\n                ) {\n                    hideWhenReady(hideAfter, currentScrollY);\n                }\n            }\n\n            lastScrollY = currentScrollY;\n            header.dispatchEvent(\n                new CustomEvent('zirbelino:header-position', {\n                    detail: {\n                        menuOverlayTop,\n                        menuPanelTop: utilityHeight + mainHeight + navigationHeight,\n                        isSticky: header.classList.contains('z-site-header--scroll-managed'),\n                        normalSearchTop,\n                        stickySearchTop,\n                    },\n                }),\n            );\n        };\n    }\n\n    function update() {\n        prepareUpdate()();\n    }\n\n    function requestUpdate() {\n        if (!layoutReady || frame) return;\n        frame = window.requestAnimationFrame(update);\n    }\n\n    function requestMeasurement() {\n        measurementRequested = true;\n        hideBoundariesDirty = true;\n        requestUpdate();\n    }\n\n    // Restored scroll positions must not immediately hide the freshly loaded header.\n    // Release the initial visibility only after an input actually scrolls the page.\n    function rememberScrollInput(event) {\n        if (!preserveInitialHeader || !event.isTrusted) return;\n        if (\n            event.type === 'keydown' &&\n            !['ArrowUp', 'ArrowDown', 'PageUp', 'PageDown', 'Home', 'End', ' ', 'Enter'].includes(\n                event.key,\n            )\n        )\n            return;\n        if (event.type === 'wheel' && event.deltaY === 0) return;\n        hasScrollInput = true;\n    }\n\n    ['wheel', 'touchmove', 'pointerdown', 'keydown'].forEach((type) => {\n        window.addEventListener(type, rememberScrollInput, { passive: true, capture: true });\n    });\n    window.addEventListener(\n        'scroll',\n        () => {\n            if (hasScrollInput) preserveInitialHeader = false;\n            requestUpdate();\n        },\n        { passive: true },\n    );\n    window.addEventListener('pageshow', (event) => {\n        if (!event.persisted) return;\n        preserveInitialHeader = true;\n        hasScrollInput = false;\n        lastScrollY = null;\n        upwardScrollDistance = 0;\n        downwardScrollDistance = 0;\n        delayNextHide = true;\n        clearHideTimer();\n        header.classList.add('z-site-header--scroll-visible');\n        requestUpdate();\n    });\n    window.addEventListener('resize', requestMeasurement);\n    desktopQuery.addEventListener('change', requestMeasurement);\n    header.addEventListener('zirbelino:menu-state', requestUpdate);\n\n    if ('ResizeObserver' in window) {\n        const resizeObserver = createLayoutObserver(() => {\n            // Read native post-layout geometry together with Hero measurements.\n            // This also handles font/row changes without a pre-layout frame read.\n            if (frame) window.cancelAnimationFrame(frame);\n            layoutReady = true;\n            measurementRequested = true;\n            hideBoundariesDirty = true;\n            return prepareUpdate();\n        });\n        [main, utility, navigation, ...navigationRows, search]\n            .filter(Boolean)\n            .forEach((element) => {\n                resizeObserver.observe(element);\n            });\n    }\n\n    document.addEventListener('zirbelino:content-updated', () => {\n        hideBoundariesDirty = true;\n    });\n\n    if ('MutationObserver' in window) {\n        const boundaryObserver = new MutationObserver(() => {\n            hideBoundariesDirty = true;\n        });\n        boundaryObserver.observe(document.documentElement, {\n            attributes: true,\n            attributeFilter: [\n                'data-sticky-header-hide',\n                'data-sticky-header-hide-full',\n                'data-sticky-header-hide-offset',\n            ],\n            subtree: true,\n        });\n    }\n\n    if (!('ResizeObserver' in window)) {\n        frame = window.requestAnimationFrame(() => {\n            frame = 0;\n            layoutReady = true;\n            requestUpdate();\n        });\n    }\n}\n","export function initCountrySwitcher(header) {\n    const switchers = [...header.querySelectorAll('[data-country-switcher]')];\n    if (!switchers.length) return;\n\n    switchers.forEach((switcher) => {\n        const menu = switcher.closest('[data-mega-menu]');\n        const updateMobilePanelHeight = () => {\n            if (!menu || window.matchMedia('(min-width: 72rem)').matches) return;\n            const availableHeight =\n                switcher.getBoundingClientRect().top -\n                menu.querySelector('.z-mega-menu__mobile-toolbar').getBoundingClientRect().bottom -\n                20;\n            switcher.style.setProperty(\n                '--z-country-panel-available-height',\n                `${Math.max(0, Math.floor(availableHeight))}px`,\n            );\n        };\n\n        switcher.addEventListener('toggle', () => {\n            if (!switcher.open) {\n                const options = switcher.querySelector('[data-country-options]');\n                if (options) options.open = false;\n                return;\n            }\n            switchers.forEach((other) => {\n                if (other !== switcher) other.open = false;\n            });\n            updateMobilePanelHeight();\n        });\n        window.addEventListener('resize', () => {\n            if (switcher.open) updateMobilePanelHeight();\n        });\n\n        const form = switcher.querySelector('[data-country-switcher-form]');\n        const options = form?.querySelector('[data-country-options]');\n        options?.addEventListener('toggle', () => {\n            switcher.toggleAttribute('data-country-options-open', options.open);\n            if (!options.open) return;\n            window.requestAnimationFrame(() => {\n                const list = options.querySelector('.z-country-switcher__options');\n                if (!list) return;\n                const selected = options\n                    .querySelector('[data-country-option]:checked')\n                    ?.closest('.z-country-switcher__option');\n                if (selected) {\n                    list.scrollTop +=\n                        selected.getBoundingClientRect().top -\n                        list.getBoundingClientRect().top -\n                        selected.clientHeight * 2;\n                }\n            });\n        });\n\n        form?.addEventListener('change', (event) => {\n            const selected = event.target;\n            if (!selected.matches?.('[data-country-option]')) return;\n            const name = form.querySelector('[data-country-selected-name]');\n            const flag = form.querySelector('[data-country-selected-flag]');\n            const optionFlag = selected.closest('label')?.querySelector('img');\n            if (name) name.textContent = selected.dataset.countryName || '';\n            if (flag && optionFlag) flag.src = optionFlag.src;\n        });\n\n        form?.querySelectorAll('.z-country-switcher__option').forEach((label) => {\n            label.addEventListener('click', (event) => {\n                if (event.detail === 0) return;\n                window.requestAnimationFrame(() => {\n                    options.open = false;\n                    options.querySelector('summary')?.focus();\n                });\n            });\n        });\n\n        form?.addEventListener('submit', async (event) => {\n            event.preventDefault();\n            const button = form.querySelector('[type=\"submit\"]');\n            if (button) button.disabled = true;\n            try {\n                const response = await fetch(form.action, {\n                    method: 'POST',\n                    body: new FormData(form),\n                    credentials: 'same-origin',\n                    cache: 'no-store',\n                });\n                if (!response.ok) throw new Error(`Country change failed: ${response.status}`);\n                window.location.reload();\n            } catch {\n                // A normal form POST still changes the country if fetch is unavailable.\n                form.submit();\n            }\n        });\n    });\n\n    document.addEventListener('pointerdown', (event) => {\n        if (switchers.some((switcher) => switcher.contains(event.target))) return;\n        switchers.forEach((switcher) => {\n            switcher.open = false;\n        });\n    });\n\n    document.addEventListener('keydown', (event) => {\n        if (event.key !== 'Escape') return;\n        const openSwitcher = switchers.find((switcher) => switcher.open);\n        if (!openSwitcher) return;\n        event.preventDefault();\n        event.stopImmediatePropagation();\n        const openOptions = openSwitcher.querySelector('[data-country-options][open]');\n        if (openOptions) {\n            openOptions.open = false;\n            openOptions.querySelector('summary')?.focus();\n            return;\n        }\n        openSwitcher.open = false;\n        openSwitcher.querySelector(':scope > summary')?.focus();\n    });\n}\n","export function createMegaMenuInput(header) {\n    const mouseInputQuery = window.matchMedia('(any-hover: hover) and (any-pointer: fine)');\n    const clickPointerTypes = new WeakMap();\n    let pendingPointer = null;\n\n    header.addEventListener(\n        'pointerdown',\n        (event) => {\n            const trigger = event.target.closest?.('[data-mega-menu-trigger]');\n            pendingPointer = trigger ? { trigger, pointerType: event.pointerType } : null;\n        },\n        { passive: true },\n    );\n    header.addEventListener('pointercancel', () => {\n        pendingPointer = null;\n    });\n    header.addEventListener('keydown', () => {\n        pendingPointer = null;\n    });\n\n    return (trigger, event) => {\n        if (!clickPointerTypes.has(event)) {\n            // Safari can report a touch-generated click as a mouse event. Keep\n            // the originating pointer through both the loader and menu handler.\n            const pointerType =\n                pendingPointer?.trigger === trigger\n                    ? pendingPointer.pointerType\n                    : event.pointerType || '';\n            pendingPointer = null;\n            clickPointerTypes.set(event, pointerType);\n        }\n        const pointerType = clickPointerTypes.get(event);\n        return {\n            pointerType,\n            usesMouseOrKeyboard:\n                pointerType === 'mouse' ||\n                (!pointerType && (event.detail === 0 || mouseInputQuery.matches)),\n        };\n    };\n}\n","import { createMegaMenuInput } from './mega-menu-input.js';\n\nlet megaMenuModule;\nconst initializedHeaders = new WeakSet();\n\nfunction loadMegaMenu() {\n    megaMenuModule ||= import('./mega-menu.js').catch((error) => {\n        megaMenuModule = null;\n        throw error;\n    });\n    return megaMenuModule;\n}\n\nexport function initMegaMenuOnDemand(header) {\n    if (initializedHeaders.has(header)) return;\n    initializedHeaders.add(header);\n\n    const triggers = [...header.querySelectorAll('[data-mega-menu-trigger]')];\n    const desktopQuery = window.matchMedia('(min-width: 72rem)');\n    let initialization;\n    let ready = false;\n\n    if (!triggers.length) return;\n    const inputForTrigger = createMegaMenuInput(header);\n\n    function initialize() {\n        initialization ||= loadMegaMenu()\n            .then(({ initMegaMenu }) => {\n                initMegaMenu(header, inputForTrigger);\n                ready = true;\n            })\n            .catch((error) => {\n                initialization = null;\n                throw error;\n            });\n        return initialization;\n    }\n\n    triggers.forEach((trigger) => {\n        trigger.addEventListener(\n            'pointerdown',\n            () => {\n                if (!ready) void initialize().catch(() => {});\n            },\n            { passive: true },\n        );\n\n        trigger.addEventListener('pointerenter', (event) => {\n            if (ready) return;\n            const pointerType = event.pointerType;\n            void initialize()\n                .then(() => {\n                    if (!trigger.matches(':hover')) return;\n                    trigger.dispatchEvent(new PointerEvent('pointerenter', { pointerType }));\n                })\n                .catch(() => {});\n        });\n\n        trigger.addEventListener('focus', () => {\n            if (ready) return;\n            void initialize()\n                .then(() => {\n                    if (document.activeElement !== trigger) return;\n                    trigger.dispatchEvent(new FocusEvent('focus'));\n                })\n                .catch(() => {});\n        });\n\n        trigger.addEventListener(\n            'click',\n            (event) => {\n                if (\n                    event.button !== 0 ||\n                    event.metaKey ||\n                    event.ctrlKey ||\n                    event.shiftKey ||\n                    event.altKey\n                )\n                    return;\n                const { pointerType, usesMouseOrKeyboard } = inputForTrigger(trigger, event);\n                if (\n                    trigger instanceof HTMLAnchorElement &&\n                    desktopQuery.matches &&\n                    usesMouseOrKeyboard\n                )\n                    return;\n                if (ready) return;\n                event.preventDefault();\n                event.stopImmediatePropagation();\n                const replayPointerType = pointerType || (!usesMouseOrKeyboard ? 'touch' : '');\n                void initialize()\n                    .then(() => {\n                        if (!replayPointerType) {\n                            trigger.click();\n                            return;\n                        }\n                        trigger.dispatchEvent(\n                            new PointerEvent('click', {\n                                bubbles: true,\n                                cancelable: true,\n                                button: 0,\n                                detail: 1,\n                                pointerType: replayPointerType,\n                            }),\n                        );\n                    })\n                    .catch(() => {\n                        if (trigger instanceof HTMLAnchorElement) {\n                            window.location.assign(trigger.href);\n                        }\n                    });\n            },\n            true,\n        );\n    });\n}\n","export function initAlgoliaSearch(container) {\n    const root = container.querySelector('#autocomplete');\n    const trigger = root?.querySelector('.aa-Temporary .aa-DetachedSearchButton');\n    if (!root || !trigger || root.dataset.zirbelinoLoaderBound === 'true') return;\n\n    root.dataset.zirbelinoLoaderBound = 'true';\n    let loading;\n    let opening = false;\n\n    const load = () => {\n        loading ??= import('./runtime/main.tsx')\n            .then(({ initSearch }) => {\n                initSearch(root);\n                document.dispatchEvent(new CustomEvent('algolia_loaded'));\n            })\n            .catch((error) => {\n                loading = undefined;\n                throw error;\n            });\n        return loading;\n    };\n\n    const openLoadedSearch = (opener) => {\n        root.dispatchEvent(new CustomEvent('zirbelino:search:open', { detail: { opener } }));\n        const button = root.querySelector(\n            '.aa-Autocomplete:not(.aa-Temporary) .aa-DetachedSearchButton',\n        );\n        if (button) button.click();\n        else window.location.assign(trigger.href);\n    };\n\n    const open = (event) => {\n        if (\n            event &&\n            (event.metaKey ||\n                event.ctrlKey ||\n                event.shiftKey ||\n                event.altKey ||\n                ('button' in event && event.button !== 0))\n        )\n            return;\n        if (event?.type === 'click') event.preventDefault();\n        if (opening) return;\n        const opener = event?.currentTarget instanceof HTMLElement ? event.currentTarget : trigger;\n\n        const loadedTrigger = root.querySelector(\n            '.aa-Autocomplete:not(.aa-Temporary) .aa-DetachedSearchButton',\n        );\n        if (loadedTrigger) {\n            openLoadedSearch(opener);\n            return;\n        }\n\n        opening = true;\n        trigger.setAttribute('aria-busy', 'true');\n        load()\n            .then(() => {\n                openLoadedSearch(opener);\n            })\n            .catch(() => window.location.assign(trigger.href))\n            .finally(() => {\n                opening = false;\n                trigger.removeAttribute('aria-busy');\n            });\n    };\n\n    trigger.addEventListener('pointerdown', open, { once: true, passive: true });\n    trigger.addEventListener('click', open);\n    container\n        .closest('[data-site-header]')\n        ?.querySelector('[data-mobile-search]')\n        ?.addEventListener('click', open);\n}\n","import { focusWithoutScroll } from '../focus-without-scroll/focus-without-scroll.js';\nexport function initBackToTop(button) {\n    const reducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)');\n    let frame = 0;\n    let visible = false;\n\n    function update() {\n        frame = 0;\n        if (visible) button.hidden = false;\n        button.classList.toggle('z-back-to-top--visible', visible);\n        if (!visible) {\n            window.setTimeout(() => {\n                if (!button.classList.contains('z-back-to-top--visible')) button.hidden = true;\n            }, 180);\n        }\n    }\n\n    function scheduleUpdate() {\n        if (!frame) frame = window.requestAnimationFrame(update);\n    }\n\n    function requestUpdate() {\n        const nextVisible = window.scrollY > Math.max(window.innerHeight, 720);\n        if (nextVisible === visible) return;\n        visible = nextVisible;\n        scheduleUpdate();\n    }\n\n    button.addEventListener('click', () => {\n        const options = { top: 0, behavior: reducedMotion.matches ? 'auto' : 'smooth' };\n        window.scrollTo(options);\n        if (focusWithoutScroll(document.querySelector('#main-content'))) {\n            // Only unsupported focus can interrupt the requested scroll.\n            window.scrollTo(options);\n        }\n    });\n    if (typeof IntersectionObserver !== 'undefined') {\n        // The inert zero-height marker follows viewport resizing through CSS.\n        // Observing its threshold crossings avoids scrollY/innerHeight reads\n        // that can flush unrelated style writes on every scroll event.\n        const marker = document.createElement('span');\n        marker.setAttribute('aria-hidden', 'true');\n        marker.style.cssText =\n            'position:absolute;top:max(100vh,720px);left:0;width:1px;height:0;pointer-events:none';\n        marker.style.top = 'max(100dvh,720px)';\n        document.body.append(marker);\n        const observer = new IntersectionObserver(\n            ([entry]) => {\n                const nextVisible = entry.boundingClientRect.top < 0;\n                if (nextVisible === visible) return;\n                visible = nextVisible;\n                scheduleUpdate();\n            },\n            // Keep the marker intersecting from page top on short viewports,\n            // so a direct jump beyond 720px still crosses an observer boundary.\n            { rootMargin: '0px 0px 720px 0px' },\n        );\n        observer.observe(marker);\n    } else {\n        window.addEventListener('scroll', requestUpdate, { passive: true });\n        window.addEventListener('resize', requestUpdate);\n        requestUpdate();\n    }\n}\n","const cartEventNames = ['zirbelino:cart:add', 'zirbelino:cart-updated', 'zirbelino:cart:change'];\nconst cartActionSelector = [\n    '[data-catalog-add]',\n    '[data-account-cart-add]',\n    '[data-shared-cart-add]',\n    '.z-product-purchase__cart',\n].join(',');\n\nexport function initCartFeedbackOnDemand(feedback) {\n    let modulePromise;\n    let initializationPromise;\n    let stylesheetAttempts = 0;\n    let controller;\n    const pendingEvents = [];\n    const reportedFailures = new WeakSet();\n\n    async function retryStylesheet(error) {\n        const match = /^Unable to preload CSS for (.+)$/.exec(error.message || '');\n        if (!match) throw error;\n        const url = new URL(match[1], window.location.href);\n        if (\n            url.origin !== window.location.origin ||\n            !/^\\/catalog\\/view\\/theme\\/zirbelino\\/dist\\/assets\\/cart-feedback-[\\w-]+\\.css$/.test(\n                url.pathname,\n            )\n        )\n            throw error;\n        if (document.visibilityState === 'hidden') {\n            await new Promise((resolve) => {\n                const resume = () => {\n                    if (document.visibilityState === 'hidden') return;\n                    document.removeEventListener('visibilitychange', resume);\n                    resolve();\n                };\n                document.addEventListener('visibilitychange', resume);\n            });\n        }\n        url.searchParams.set('__shop_css_retry', String(++stylesheetAttempts));\n        await new Promise((resolve, reject) => {\n            const link = document.createElement('link');\n            const timer = window.setTimeout(() => fail(), 15000);\n            const cleanup = () => {\n                window.clearTimeout(timer);\n                link.onload = link.onerror = null;\n            };\n            const fail = () => {\n                cleanup();\n                link.remove();\n                reject(error);\n            };\n            link.rel = 'stylesheet';\n            // This loader owns its bounded retry; the global resource observer\n            // must not clone another retry after this one fails.\n            link.dataset.clientRuntimeRetried = 'true';\n            link.href = url.href;\n            link.onload = () => {\n                cleanup();\n                resolve();\n            };\n            link.onerror = fail;\n            document.head.appendChild(link);\n        });\n    }\n\n    const loadModule = () =>\n        (modulePromise ||= import('./cart-feedback.js')\n            .catch(async (error) => {\n                await retryStylesheet(error);\n                return import('./cart-feedback.js?retry');\n            })\n            .catch((error) => {\n                modulePromise = undefined;\n                throw error;\n            }));\n\n    const reportFailure = (error) => {\n        try {\n            if (reportedFailures.has(error)) return;\n            reportedFailures.add(error);\n            error.cartFeedbackDiagnostics = {\n                operation: 'load',\n                visibility: document.visibilityState,\n                online: navigator.onLine,\n                pending_events: pendingEvents.map((event) => event.type),\n            };\n            window.clientRuntime?.captureException(error);\n        } catch {\n            /* Monitoring must not change the successful cart mutation. */\n        }\n    };\n\n    const initialize = () => {\n        if (controller) return Promise.resolve(controller);\n        return (initializationPromise ||= (async () => {\n            const module = await loadModule();\n            controller = module.initCartFeedback(feedback);\n            pendingEvents.splice(0).forEach((event) => controller.handle(event));\n            return controller;\n        })().catch((error) => {\n            initializationPromise = undefined;\n            throw error;\n        }));\n    };\n\n    cartEventNames.forEach((eventName) => {\n        document.addEventListener(eventName, (event) => {\n            if (controller) return;\n            pendingEvents.push({ type: event.type, detail: event.detail });\n            void initialize().catch(reportFailure);\n        });\n    });\n\n    document.addEventListener(\n        'pointerdown',\n        (event) => {\n            if (event.target instanceof Element && event.target.closest(cartActionSelector)) {\n                // Warmup failure is handled by the actual cart event. It must\n                // neither become an unhandled rejection nor poison later loads.\n                void loadModule().catch(() => {});\n            }\n        },\n        { capture: true, passive: true },\n    );\n}\n","import { focusWithoutScroll } from '../focus-without-scroll/focus-without-scroll.js';\nconst fieldSelector = 'input:not([type=\"hidden\"]), select, textarea';\n\nfunction connectServerErrors(form) {\n    const wrapperSelector = '.z-field, .z-form-card__field';\n    form.querySelectorAll('.z-field__error, .z-form-card__error').forEach((error, index) => {\n        if (!error.textContent.trim() || error.closest('[hidden], [aria-hidden=\"true\"]')) return;\n        const style = window.getComputedStyle(error);\n        if (style.display === 'none' || style.visibility === 'hidden') return;\n\n        const wrapper = error.closest(wrapperSelector);\n        const fields = [...(wrapper?.querySelectorAll(fieldSelector) || [])].filter(\n            (field) => field.closest(wrapperSelector) === wrapper,\n        );\n        if (!fields.length) return;\n\n        if (!error.id) {\n            const baseId = fields[0].id ? `${fields[0].id}-error` : `z-field-error-${index + 1}`;\n            let id = baseId;\n            let suffix = 1;\n            while (document.getElementById(id)) id = `${baseId}-${suffix++}`;\n            error.id = id;\n        }\n        fields.forEach((field) => {\n            const describedBy = new Set(\n                (field.getAttribute('aria-describedby') || '').split(/\\s+/).filter(Boolean),\n            );\n            describedBy.add(error.id);\n            field.setAttribute('aria-describedby', [...describedBy].join(' '));\n            field.setAttribute('aria-invalid', 'true');\n        });\n        error.closest('details')?.setAttribute('open', '');\n    });\n}\n\nfunction visibleInvalidField(form) {\n    return [...form.querySelectorAll(fieldSelector)].find(\n        (field) => !field.validity.valid && field.getClientRects().length,\n    );\n}\n\nexport function initFormUsability(form) {\n    let focusScheduled = false;\n    const reducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)');\n    connectServerErrors(form);\n\n    form.addEventListener(\n        'invalid',\n        (event) => {\n            if (!(event.target instanceof HTMLElement) || !event.target.matches(fieldSelector)) {\n                return;\n            }\n\n            event.target.setAttribute('aria-invalid', 'true');\n            if (focusScheduled) return;\n            focusScheduled = true;\n            window.requestAnimationFrame(() => {\n                const field = visibleInvalidField(form);\n                focusWithoutScroll(field);\n                field?.scrollIntoView({\n                    behavior: reducedMotion.matches ? 'auto' : 'smooth',\n                    block: 'center',\n                });\n                focusScheduled = false;\n            });\n        },\n        true,\n    );\n\n    const updateValidity = (event) => {\n        if (!(event.target instanceof HTMLElement) || !event.target.matches(fieldSelector)) return;\n        if (event.target.validity.valid) event.target.removeAttribute('aria-invalid');\n    };\n    form.addEventListener('input', updateValidity);\n    form.addEventListener('change', updateValidity);\n}\n","import {\n    getBlazeSlider,\n    refreshBlazeSlider,\n    showBlazeSlide,\n} from '../common/blaze-slider/blaze-slider-loader.js';\nimport { toggleWishlist } from '../common/wishlist/wishlist.js';\nimport { getCartSummary } from '../common/cart-state/cart-state.js';\nimport { showCartAddError } from '../common/cart-add-error/cart-add-error-loader.js';\n\nfunction sourceContext(button) {\n    if (button.closest('[data-checkout-success-upsell]')) return 'checkout_success_upsell';\n    const placement = button.closest('[data-recommendation-placement]')?.dataset\n        .recommendationPlacement;\n    if (placement) return `${placement}_recommendation`;\n    if (button.closest('[data-product-page-recommendations]')) return 'product_page_recommendation';\n    if (button.closest('[data-cart-add-recommendations]')) return 'cart_add_recommendation';\n    if (button.closest('[data-cart-page-recommendations]')) return 'cart_page_recommendation';\n    return button.closest('[data-analytics-component]') ? 'storefront_module' : 'product_list';\n}\n\nconst initializedRoots = new WeakSet();\nconst observedRowGroups = new WeakMap();\nconst observedCommerce = new WeakMap();\nconst observedCards = new WeakMap();\nconst pendingRowGroups = new Set();\nlet rowGroupResizeObserver;\nlet rowAlignmentFrame;\n\nfunction productCardRowGroups(root) {\n    const groups = [];\n    const containingGroup = root.closest?.('.z-product-card-row-grid');\n    if (containingGroup) groups.push(containingGroup);\n    root.querySelectorAll?.('.z-product-card-row-grid').forEach((group) => groups.push(group));\n    return groups;\n}\n\nfunction productCardsInGroup(group) {\n    return [...group.children]\n        .map((item) =>\n            item.matches('.z-product-card') ? item : item.querySelector(':scope > .z-product-card'),\n        )\n        .filter((card) => card && !card.matches('.z-product-card--cart-feedback'));\n}\n\nfunction alignProductCardRowGroups(groups) {\n    const assignments = [];\n    groups\n        .filter((group) => group.isConnected)\n        .forEach((group) => {\n            const state = observedRowGroups.get(group);\n            let items = productCardsInGroup(group)\n                .map((card) => {\n                    const commerce = card.querySelector('.z-product-card__commerce');\n                    const slot = card.querySelector('.z-product-card__commerce-slot');\n                    if (!commerce || !slot) return undefined;\n                    return {\n                        card,\n                        slot,\n                        width: state?.items.get(commerce)?.width,\n                        height: state\n                            ? state.items.get(commerce)?.height\n                            : commerce.getBoundingClientRect().height,\n                    };\n                })\n                .filter(Boolean);\n            // The first native delivery includes card widths and natural commerce boxes. Never\n            // substitute a geometry read while a newly inserted card awaits delivery.\n            if (items.some((item) => item.height === undefined)) return;\n            if (state) {\n                if (!(state.width > 0) || items.some((item) => item.width === undefined)) return;\n                items = items.filter((item) => item.width > 0);\n            }\n            if (!items.length) return;\n            const rail = group.matches('[data-blaze-slider], .blaze-track');\n            // Equal minmax grid columns have less than one card's width of combined\n            // gaps. One CSS pixel covers fractional border-box rounding at breakpoints.\n            const columns = state\n                ? Math.min(\n                      items.length,\n                      Math.max(1, Math.floor((state.width + 1) / items[0].width)),\n                  )\n                : 1;\n            const rows = new Map();\n            items.forEach((item, index) => {\n                const position = state\n                    ? rail\n                        ? 0\n                        : Math.floor(index / columns)\n                    : Math.round(item.card.getBoundingClientRect().top / 2) * 2;\n                const row = rows.get(position) || [];\n                row.push(item);\n                rows.set(position, row);\n            });\n            rows.forEach((row) => {\n                const tallest = Math.max(0, ...row.map((item) => item.height));\n                const height = row.length > 1 && tallest ? `${Math.ceil(tallest)}px` : '';\n                row.forEach(({ slot }) => assignments.push({ slot, height }));\n            });\n        });\n    // Only the outer slot receives a minimum. Its natural inner commerce box can\n    // therefore report both growth and shrinkage without reset/read layout cycles.\n    assignments.forEach(({ slot, height }) => {\n        if (slot.style.getPropertyValue('--z-product-card-commerce-height') === height) return;\n        if (height) slot.style.setProperty('--z-product-card-commerce-height', height);\n        else slot.style.removeProperty('--z-product-card-commerce-height');\n    });\n}\n\nfunction releaseObservedProductCard(item) {\n    if (observedCommerce.get(item.commerce) === item) {\n        rowGroupResizeObserver.unobserve(item.commerce);\n        observedCommerce.delete(item.commerce);\n    }\n    if (observedCards.get(item.card) === item) {\n        rowGroupResizeObserver.unobserve(item.card);\n        observedCards.delete(item.card);\n    }\n}\n\nfunction releaseProductCardRowGroup(group) {\n    const state = observedRowGroups.get(group);\n    state?.mutationObserver.disconnect();\n    state?.items.forEach(releaseObservedProductCard);\n    rowGroupResizeObserver?.unobserve(group);\n    observedRowGroups.delete(group);\n    pendingRowGroups.delete(group);\n}\n\nfunction syncProductCardRowGroup(group) {\n    const state = observedRowGroups.get(group);\n    if (!state) return;\n    const current = new Set();\n    productCardsInGroup(group).forEach((card) => {\n        const commerce = card.querySelector('.z-product-card__commerce');\n        const slot = card.querySelector('.z-product-card__commerce-slot');\n        if (!commerce || !slot) return;\n        current.add(commerce);\n        if (state.items.has(commerce)) return;\n        const item = { group, card, commerce, slot, height: undefined, width: undefined };\n        state.items.set(commerce, item);\n        observedCommerce.set(commerce, item);\n        observedCards.set(card, item);\n        rowGroupResizeObserver.observe(commerce, { box: 'border-box' });\n        rowGroupResizeObserver.observe(card, { box: 'border-box' });\n    });\n    state.items.forEach((item, commerce) => {\n        if (current.has(commerce)) return;\n        releaseObservedProductCard(item);\n        state.items.delete(commerce);\n    });\n}\n\nfunction flushProductCardRowAlignment() {\n    rowAlignmentFrame = undefined;\n    const groups = [...pendingRowGroups].filter((group) => {\n        if (group.isConnected) return true;\n        releaseProductCardRowGroup(group);\n        return false;\n    });\n    pendingRowGroups.clear();\n    alignProductCardRowGroups(groups);\n}\n\nfunction scheduleProductCardRowAlignment(group) {\n    if (!group?.matches?.('.z-product-card-row-grid')) return;\n    pendingRowGroups.add(group);\n    if (rowAlignmentFrame !== undefined) return;\n    rowAlignmentFrame = window.requestAnimationFrame(flushProductCardRowAlignment);\n}\n\nfunction observedBorderBoxSize(entry, horizontal = false) {\n    const borderBox = entry.borderBoxSize?.[0] || entry.borderBoxSize;\n    const size = horizontal ? borderBox?.inlineSize : borderBox?.blockSize;\n    if (size !== undefined) return size;\n    // Supported browsers provide borderBoxSize. Preserve older RO implementations\n    // with a style-only fallback; never query card positions in the native path.\n    const style = getComputedStyle(entry.target);\n    const edges = horizontal\n        ? ['paddingLeft', 'paddingRight', 'borderLeftWidth', 'borderRightWidth']\n        : ['paddingTop', 'paddingBottom', 'borderTopWidth', 'borderBottomWidth'];\n    return edges.reduce(\n        (total, edge) => total + (parseFloat(style[edge]) || 0),\n        horizontal ? entry.contentRect.width : entry.contentRect.height,\n    );\n}\n\nfunction observeProductCardRowGroup(group) {\n    if (typeof ResizeObserver === 'undefined' || observedRowGroups.has(group)) return;\n    rowGroupResizeObserver ||= new ResizeObserver((entries) => {\n        const groups = new Set();\n        entries.forEach((entry) => {\n            const commerceItem = observedCommerce.get(entry.target);\n            const item = commerceItem || observedCards.get(entry.target);\n            const group = item?.group || entry.target;\n            if (!group.isConnected) {\n                releaseProductCardRowGroup(group);\n                return;\n            }\n            if (!observedRowGroups.has(group)) return;\n            if (item && (!entry.target.isConnected || !group.contains(entry.target))) {\n                syncProductCardRowGroup(group);\n                groups.add(group);\n                return;\n            }\n            if (item) {\n                const key = commerceItem ? 'height' : 'width';\n                const size = observedBorderBoxSize(entry, !commerceItem);\n                if (item[key] === size) return;\n                item[key] = size;\n            } else {\n                const state = observedRowGroups.get(group);\n                const width = entry.contentRect.width;\n                if (state.width === width) return;\n                state.width = width;\n            }\n            groups.add(group);\n        });\n        // Native RO widths and heights require no synchronous style/layout queries,\n        // even if another component's earlier observer changed the document.\n        alignProductCardRowGroups([...groups]);\n    });\n    const mutationObserver = new MutationObserver(() => {\n        if (!group.isConnected) {\n            releaseProductCardRowGroup(group);\n            return;\n        }\n        syncProductCardRowGroup(group);\n        scheduleProductCardRowAlignment(group);\n    });\n    observedRowGroups.set(group, { items: new Map(), mutationObserver });\n    mutationObserver.observe(group, { childList: true });\n    rowGroupResizeObserver.observe(group);\n    syncProductCardRowGroup(group);\n}\n\nfunction alignProductCardRows(root = document) {\n    const groups = productCardRowGroups(root);\n    if (typeof ResizeObserver === 'undefined') {\n        alignProductCardRowGroups(groups);\n        return;\n    }\n    const initialized = groups.filter((group) => observedRowGroups.has(group));\n    groups.forEach(observeProductCardRowGroup);\n    initialized.forEach(syncProductCardRowGroup);\n    initialized.forEach(scheduleProductCardRowAlignment);\n}\n\nfunction updateShippingNotes(root, summary) {\n    if (!summary) return;\n    root.querySelectorAll('[data-product-card-shipping]').forEach((note) => {\n        const threshold = Number(note.dataset.shippingThreshold);\n        const productAmount = Number(note.dataset.shippingProductAmount);\n        const standardAmount = Number(note.dataset.shippingStandardAmount);\n        if (![threshold, productAmount, standardAmount].every(Number.isFinite)) return;\n        const freeShipping =\n            summary.freeShipping ||\n            note.dataset.shippingExempt === 'true' ||\n            standardAmount <= 0 ||\n            threshold <= 0 ||\n            summary.subtotalWithoutGiftCards + productAmount >= threshold;\n        note.textContent = freeShipping\n            ? ', versandkostenfrei'\n            : `, zzgl. ${note.dataset.shippingCost} Versand`;\n    });\n}\n\nfunction loadDeferredSlide(slide) {\n    const image = slide?.querySelector('.z-product-card__image[data-src]');\n    if (!image) return;\n    const src = image.dataset.src;\n    const srcset = image.dataset.srcset;\n    const sizes = image.dataset.sizes;\n    delete image.dataset.src;\n    delete image.dataset.srcset;\n    delete image.dataset.sizes;\n    if (sizes) image.sizes = sizes;\n    if (srcset) image.srcset = srcset;\n    if (src) image.src = src;\n}\n\nfunction updateGalleryPage(gallery, activeIndex = 0) {\n    const card = gallery.closest('.z-product-card');\n    const pages = [...(card?.querySelectorAll('[data-product-card-page]') || [])];\n    if (!pages.length) return;\n    pages.forEach((page, index) => {\n        const isActive = index === activeIndex;\n        page.classList.toggle('is-active', isActive);\n        page.toggleAttribute('aria-current', isActive);\n    });\n}\n\nfunction selectGalleryPage(button) {\n    const gallery = button.closest('.z-product-card')?.querySelector('[data-product-card-gallery]');\n    const index = Number(button.dataset.productCardPage);\n    const slides = [...(gallery?.querySelectorAll('[data-product-card-slide]') || [])];\n    if (!gallery || !Number.isInteger(index) || !slides[index]) return;\n    loadDeferredSlide(slides[index]);\n    if (showBlazeSlide(gallery, index)) return;\n    slides[index].scrollIntoView({ behavior: 'smooth', block: 'nearest', inline: 'start' });\n}\n\nfunction moveGalleryByKeyboard(gallery, direction) {\n    const slides = [...gallery.querySelectorAll('[data-product-card-slide]')];\n    if (slides.length < 2) return;\n    const slider = getBlazeSlider(gallery);\n    const currentIndex = slider?.states[slider.stateIndex]?.page[0] || 0;\n    const nextIndex = Math.max(0, Math.min(slides.length - 1, currentIndex + direction));\n    loadDeferredSlide(slides[nextIndex]);\n    if (showBlazeSlide(gallery, nextIndex)) return;\n    slides[nextIndex].scrollIntoView({ behavior: 'smooth', block: 'nearest', inline: 'start' });\n}\n\nfunction removeBrokenAdditionalSlide(image) {\n    const slide = image.closest('[data-product-card-slide]');\n    const gallery = slide?.closest('[data-product-card-gallery]');\n    const card = gallery?.closest('.z-product-card');\n    if (!slide || !gallery || !card || slide.hasAttribute('data-product-card-primary-slide'))\n        return false;\n\n    const slides = [...gallery.querySelectorAll('[data-product-card-slide]')];\n    const failedIndex = slides.indexOf(slide);\n    const page = card.querySelector(`[data-product-card-page=\"${failedIndex}\"]`);\n    slide.remove();\n    page?.remove();\n\n    const remainingPages = [...card.querySelectorAll('[data-product-card-page]')];\n    const pagination = card.querySelector('.z-product-card__pagination');\n    remainingPages.forEach((remainingPage, index) => {\n        remainingPage.dataset.productCardPage = String(index);\n        remainingPage.setAttribute('aria-label', `Produktbild ${index + 1} anzeigen`);\n    });\n    if (pagination) {\n        pagination.dataset.productCardPages = String(remainingPages.length);\n    }\n    if (remainingPages.length <= 1) {\n        pagination?.remove();\n        gallery.classList.remove('z-product-card__gallery--scrollable');\n        gallery.removeAttribute('data-product-card-gallery');\n    }\n    refreshBlazeSlider(gallery);\n    updateGalleryPage(gallery);\n    return true;\n}\n\nasync function showAddError(button, result = null, uncertain = true) {\n    await showCartAddError({ result, uncertain }, button);\n}\n\nasync function addProduct(button) {\n    const productId = button.dataset.productId;\n    if (!productId || button.disabled) return;\n    const quantity = Math.max(1, Number.parseInt(button.dataset.catalogQuantity || '1', 10) || 1);\n    const requestBody = new URLSearchParams({ product_id: productId, quantity: String(quantity) });\n    if (button.dataset.recommendationContextToken) {\n        requestBody.set(\n            'product_recommendation_context_token',\n            button.dataset.recommendationContextToken,\n        );\n    }\n    try {\n        const options = JSON.parse(button.dataset.catalogOptions || '{}');\n        Object.entries(options).forEach(([optionId, value]) => {\n            const values = Array.isArray(value) ? value : [value];\n            values.forEach((optionValue) => {\n                const name = Array.isArray(value) ? `option[${optionId}][]` : `option[${optionId}]`;\n                requestBody.append(name, String(optionValue));\n            });\n        });\n    } catch {\n        // The cart endpoint still validates incomplete optional metadata.\n    }\n\n    button.disabled = true;\n    button.setAttribute('aria-busy', 'true');\n    const originalLabel = button.getAttribute('aria-label') || 'In den Warenkorb legen';\n    try {\n        const response = await fetch('/index.php?route=checkout/cart/add', {\n            method: 'POST',\n            credentials: 'same-origin',\n            headers: { 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8' },\n            body: requestBody,\n        });\n        if (!response.ok) {\n            await showAddError(button);\n            return;\n        }\n        const result = await response.json();\n        if (!result || typeof result !== 'object' || Array.isArray(result)) {\n            await showAddError(button);\n            return;\n        }\n        if (!result.success || result.error) {\n            const rejected = result.success === false || Boolean(result.error);\n            await showAddError(button, result, !rejected);\n            return;\n        }\n        if (result.redirect) {\n            window.location.assign(result.redirect);\n            return;\n        }\n\n        result.zirbelino_source_context = sourceContext(button);\n        button.classList.add('is-added');\n        button.setAttribute('aria-label', 'Zum Warenkorb hinzugefügt');\n        document.dispatchEvent(new CustomEvent('zirbelino:cart:add', { detail: result }));\n        window.setTimeout(() => {\n            button.classList.remove('is-added');\n            button.setAttribute('aria-label', originalLabel);\n        }, 2_500);\n    } catch {\n        await showAddError(button);\n    } finally {\n        button.disabled = false;\n        button.removeAttribute('aria-busy');\n    }\n}\n\nasync function toggleCardWishlist(button) {\n    const productId = button.dataset.productId;\n    if (!productId || button.disabled) return;\n\n    try {\n        const change = await toggleWishlist(button);\n        if (change?.saved) {\n            try {\n                window.analytics?.trackInteraction?.('add_to_wishlist', {\n                    product_ids: [change.productId],\n                    source_context: sourceContext(button),\n                });\n            } catch {\n                // Saving a wishlist item must never depend on analytics.\n            }\n        }\n    } catch {\n        window.location.assign('/index.php?route=account/wishlist');\n    }\n}\n\nexport function initProductCards(root = document) {\n    if (initializedRoots.has(root)) {\n        alignProductCardRows(root);\n        return;\n    }\n    initializedRoots.add(root);\n\n    if (root === document) {\n        updateShippingNotes(document, getCartSummary());\n        document.addEventListener('zirbelino:cart-state', (event) => {\n            updateShippingNotes(document, event.detail);\n            productCardRowGroups(document).forEach(scheduleProductCardRowAlignment);\n        });\n        document.addEventListener('zirbelino:content-updated', (event) => {\n            const content = event.detail?.root;\n            if (!(content instanceof Element)) return;\n            updateShippingNotes(content, getCartSummary());\n            alignProductCardRows(content);\n        });\n    } else {\n        updateShippingNotes(root, getCartSummary());\n    }\n\n    root.addEventListener('click', (event) => {\n        const galleryPage = event.target.closest('[data-product-card-page]');\n        if (galleryPage) {\n            selectGalleryPage(galleryPage);\n            return;\n        }\n\n        const addButton = event.target.closest('[data-catalog-add]');\n        if (addButton) {\n            void addProduct(addButton);\n            return;\n        }\n\n        const wishlistButton = event.target.closest('[data-catalog-wishlist]');\n        if (wishlistButton) void toggleCardWishlist(wishlistButton);\n    });\n    root.addEventListener('keydown', (event) => {\n        const gallery = event.target.closest?.('[data-product-card-gallery]');\n        if (!gallery || !['ArrowLeft', 'ArrowRight'].includes(event.key)) return;\n        event.preventDefault();\n        moveGalleryByKeyboard(gallery, event.key === 'ArrowRight' ? 1 : -1);\n    });\n    root.addEventListener('zirbelino:slider-change', (event) => {\n        scheduleProductCardRowAlignment(event.target.closest?.('.z-product-card-row-grid'));\n        const gallery = event.target.closest?.('[data-product-card-gallery]');\n        if (!gallery) return;\n        const activeIndex = event.detail?.firstSlideIndex || 0;\n        loadDeferredSlide(gallery.querySelectorAll('[data-product-card-slide]')[activeIndex]);\n        updateGalleryPage(gallery, activeIndex);\n    });\n    root.addEventListener('pointerdown', (event) => {\n        const gallery = event.target.closest?.('[data-product-card-gallery]');\n        if (!gallery) return;\n        gallery.querySelectorAll('[data-product-card-slide]').forEach(loadDeferredSlide);\n    });\n    root.addEventListener(\n        'error',\n        (event) => {\n            const image = event.target;\n            if (\n                !image.matches?.('.z-product-card__image') ||\n                image.dataset.fallbackApplied === 'true'\n            )\n                return;\n            if (removeBrokenAdditionalSlide(image)) return;\n            image.dataset.fallbackApplied = 'true';\n            image.removeAttribute('srcset');\n            image.removeAttribute('sizes');\n            image.src = '/image/no_image.png';\n        },\n        true,\n    );\n\n    alignProductCardRows(root);\n    if (typeof ResizeObserver !== 'undefined') return;\n    const alignAfterFonts = () => {\n        productCardRowGroups(root).forEach(scheduleProductCardRowAlignment);\n    };\n    window.addEventListener('resize', alignAfterFonts, { passive: true });\n    const fonts = document.fonts;\n    if (!fonts) return;\n    fonts.addEventListener('loadingdone', alignAfterFonts);\n    // Some supported browsers do not emit loadingdone. Read the ready promise\n    // after natural first rendering, since its getter can force initial layout.\n    window.requestAnimationFrame(() => {\n        window.requestAnimationFrame(() => fonts.ready.then(alignAfterFonts));\n    });\n}\n","const preparedRails = new WeakSet();\nlet modulePromise;\n\nfunction loadDragScroll() {\n    modulePromise ||= import('./drag-scroll.js').catch((error) => {\n        modulePromise = undefined;\n        throw error;\n    });\n    return modulePromise;\n}\n\nexport function initDragScrollOnDemand(rail) {\n    if (preparedRails.has(rail)) return;\n    preparedRails.add(rail);\n\n    const initialize = () => {\n        rail.removeEventListener('pointerenter', initialize);\n        rail.removeEventListener('pointerdown', initialize);\n        rail.removeEventListener('focusin', initialize);\n        void loadDragScroll()\n            .then(({ initDragScroll }) => {\n                if (rail.isConnected) initDragScroll(rail);\n            })\n            .catch(() => {\n                // Native overflow remains available after a network failure.\n                // Allow a later interaction to retry the optional enhancement.\n                if (rail.isConnected) bind();\n            });\n    };\n\n    // Touch users retain native overflow scrolling. Pointer hover warms the\n    // small mouse-drag enhancement before a desktop press normally arrives.\n    const bind = () => {\n        rail.addEventListener('pointerenter', initialize, { passive: true });\n        rail.addEventListener('pointerdown', initialize, { passive: true });\n        rail.addEventListener('focusin', initialize);\n    };\n    bind();\n}\n","const CANDIDATE_ATTRIBUTE = 'data-prefetch-candidate';\nconst PREDICTED_ATTRIBUTE = 'data-prefetch-predicted';\nconst SKIP_ATTRIBUTE = 'data-prefetch-skip';\nconst PREFETCH_REACTIVATE_MS = 5 * 60 * 1000;\nconst REGISTRATION_BATCH_SIZE = 8;\nconst REGISTRATION_BUDGET_MS = 4;\n\nconst candidateSelector = [\n    'a[data-prefetch]',\n    `a[${CANDIDATE_ATTRIBUTE}]`,\n    'a.z-site-header__logo',\n    'a.z-site-header__nav-item',\n    'a.z-site-header__sale-link',\n    '.z-mega-menu a[href]',\n    'main a.z-button',\n    'main a.z-text-link',\n    'main a.z-slider-heading__action',\n    'main a.z-product-card__slide',\n    'main a.z-product-card__link',\n    'main a.z-product-card__action-link',\n    'main .z-category-showcase-section a[href]',\n    'main a.z-category-card',\n    'main a.z-category-result',\n    'main a.z-category-list-module__card',\n    'main a.z-category-list-module__sub-link',\n    'main .z-catalog-sidebar nav a[href]',\n    'main a.z-manufacturer-card',\n    'main a.z-page-card',\n    'main a.z-bundle-card__link',\n    'main a.z-craft-story__media',\n    'main a.z-harvest-feature__media',\n    'main a.z-blog-card__media',\n    'main .z-blog-card__title a[href]',\n    'main a.z-blog-card__link',\n    'main .z-blog-article__aside > a[href]',\n    'main a.z-reviews__product',\n    'main a.z-product-review-page__media',\n    'main a.z-product-gallery__bubble-link',\n    'main .z-breadcrumbs a[href]',\n    'main .pagination a[href]',\n    'main .z-pagination a[href]',\n].join(',');\n\nconst sensitiveRoutePrefixes = [\n    'account',\n    'api',\n    'checkout',\n    'common/cart',\n    'extension/payment',\n    'management',\n    'product/download',\n    'tool',\n];\n// These are useful navigations but not part of the audited safe-document\n// prefetch routes; the origin deliberately refuses speculative GETs for them.\nconst unsupportedDocumentRoutes = new Set([\n    'information/contact',\n    'information/revocation',\n    'information/tracking',\n    'product/reviews',\n    'product/search',\n]);\nconst sensitiveRouteActions = new Set([\n    'add',\n    'delete',\n    'download',\n    'edit',\n    'invoice',\n    'login',\n    'logout',\n    'password',\n    'product_recommendation_context_token',\n    'pricehistory',\n    'register',\n    'remove',\n    'success',\n    'upload',\n    'write',\n]);\nconst sensitiveQueryParameters = new Set([\n    'address_id',\n    'code',\n    'customer_id',\n    'download_id',\n    'invoice_id',\n    'key',\n    'nonce',\n    'order_id',\n    'password',\n    'return_id',\n    'session',\n    'token',\n]);\nconst sensitivePathPattern =\n    /(?:^|\\/)(?:account|admin|alle-downloads|anmelden|abmelden|bestellung|cart|checkout|contact|downloads?|invoice|kasse|kontakt|konto|login|logout|management|order|payment|rechnung|register|registrieren|return|revocation|ruecksendung|tracking|warenkorb|widerrufsformular|wishlist|wunschliste)(?:\\/|$)/i;\nconst downloadablePathPattern =\n    /\\.(?:csv|docx?|epub|ics|jpe?g|mp3|mp4|pdf|png|svg|webm|webp|xlsx?|zip)$/i;\n\nlet initialized = false;\nlet foresightManager = null;\nlet foresightLoadPromise = null;\nlet speculationRulesSupported = null;\nconst prefetchedUrls = new Map();\nconst reactivatingUrls = new Set();\nconst registeredLinks = new Map();\nconst pendingRegistrations = new Set();\nconst observedRegistrationLinks = new WeakSet();\nlet registrationObserver;\nlet registrationScheduled = false;\n\nfunction backgroundWorkShouldBeSkipped() {\n    const connection = Reflect.get(navigator, 'connection');\n    return Boolean(connection?.saveData || ['slow-2g', '2g'].includes(connection?.effectiveType));\n}\n\nfunction supportsSpeculationRules() {\n    if (speculationRulesSupported !== null) return speculationRulesSupported;\n    const supports = Reflect.get(HTMLScriptElement, 'supports');\n    speculationRulesSupported =\n        typeof supports === 'function' && supports.call(HTMLScriptElement, 'speculationrules');\n    return speculationRulesSupported;\n}\n\nfunction normalizedNavigationKey(url) {\n    const comparable = new URL(url);\n    comparable.hash = '';\n    return `${comparable.pathname}${comparable.search}`;\n}\n\nfunction hasSensitiveRoute(url) {\n    const route = (url.searchParams.get('route') || '')\n        .trim()\n        .replace(/^\\/+|\\/+$/g, '')\n        .toLowerCase();\n    if (!route) return false;\n    if (unsupportedDocumentRoutes.has(route)) return true;\n    if (\n        sensitiveRoutePrefixes.some((prefix) => route === prefix || route.startsWith(`${prefix}/`))\n    ) {\n        return true;\n    }\n    return route.split('/').some((part) => sensitiveRouteActions.has(part));\n}\n\nfunction isEligibleLink(link) {\n    if (!(link instanceof HTMLAnchorElement)) return false;\n    if (link.closest(`[${SKIP_ATTRIBUTE}]`)) return false;\n    if (link.hasAttribute('download')) return false;\n    if (link.target && link.target.toLowerCase() !== '_self') return false;\n    if (/\\b(?:external|nofollow)\\b/i.test(link.rel)) return false;\n\n    const href = link.getAttribute('href')?.trim();\n    if (!href || href.startsWith('#')) return false;\n\n    let url;\n    try {\n        url = new URL(href, document.baseURI);\n    } catch {\n        return false;\n    }\n\n    if (!['http:', 'https:'].includes(url.protocol)) return false;\n    if (url.origin !== window.location.origin) return false;\n    if (normalizedNavigationKey(url) === normalizedNavigationKey(location.href)) {\n        return false;\n    }\n    if (sensitivePathPattern.test(url.pathname)) return false;\n    if (downloadablePathPattern.test(url.pathname)) return false;\n    if (hasSensitiveRoute(url)) return false;\n    if (\n        [...url.searchParams.keys()].some((parameter) =>\n            sensitiveQueryParameters.has(parameter.toLowerCase()),\n        )\n    ) {\n        return false;\n    }\n\n    return true;\n}\n\nfunction candidateLinks(root = document) {\n    const links = [];\n    if (root instanceof Element && root.matches(candidateSelector)) {\n        links.push(root);\n    }\n    if (root instanceof Document || root instanceof Element) {\n        links.push(...root.querySelectorAll(candidateSelector));\n    }\n    return links;\n}\n\nfunction addSpeculationRules(rules) {\n    const script = document.createElement('script');\n    script.type = 'speculationrules';\n    script.textContent = JSON.stringify(rules);\n    document.head.append(script);\n    return script;\n}\n\nfunction prefetchWithForesight(link, url) {\n    if (backgroundWorkShouldBeSkipped() || reactivatingUrls.has(url)) {\n        return;\n    }\n\n    const existing = prefetchedUrls.get(url);\n    if (existing && Date.now() - existing < PREFETCH_REACTIVATE_MS) {\n        link.setAttribute(PREDICTED_ATTRIBUTE, '');\n        return;\n    }\n\n    // Clear both document-rule matches for every link to this URL. Chrome\n    // needs a rendered frame without matches to cancel the old speculation.\n    if (existing) {\n        reactivatingUrls.add(url);\n        registeredLinks.forEach((registration, registeredLink) => {\n            if (registration.url === url) {\n                registeredLink.removeAttribute(CANDIDATE_ATTRIBUTE);\n                registeredLink.removeAttribute(PREDICTED_ATTRIBUTE);\n            }\n        });\n    }\n    const activate = () => {\n        if (!link.isConnected || !isEligibleLink(link) || backgroundWorkShouldBeSkipped()) return;\n        const currentUrl = new URL(link.href, document.baseURI);\n        currentUrl.hash = '';\n        if (currentUrl.href !== url) return;\n        link.setAttribute(PREDICTED_ATTRIBUTE, '');\n        prefetchedUrls.set(url, Date.now());\n    };\n    if (existing) {\n        window.requestAnimationFrame(() => {\n            window.requestAnimationFrame(() => {\n                reactivatingUrls.delete(url);\n                registeredLinks.forEach((registration, registeredLink) => {\n                    if (registration.url === url) refreshLink(registeredLink);\n                });\n                activate();\n            });\n        });\n    } else activate();\n}\n\nfunction unregisterStaleLinks() {\n    registeredLinks.forEach((registration, link) => {\n        const currentUrl =\n            link.isConnected && isEligibleLink(link) ? new URL(link.href, document.baseURI) : null;\n        if (currentUrl) currentUrl.hash = '';\n        if (currentUrl?.href === registration.url) return;\n        link.removeAttribute(PREDICTED_ATTRIBUTE);\n        registration.unregister();\n        registeredLinks.delete(link);\n    });\n    const registeredUrls = new Set(\n        [...registeredLinks.values()].map((registration) => registration.url),\n    );\n    prefetchedUrls.forEach((_, url) => {\n        if (!registeredUrls.has(url)) prefetchedUrls.delete(url);\n    });\n}\n\nfunction registerLink(link) {\n    if (\n        !foresightManager ||\n        registeredLinks.has(link) ||\n        !link.isConnected ||\n        backgroundWorkShouldBeSkipped() ||\n        !isEligibleLink(link)\n    ) {\n        return;\n    }\n\n    const url = new URL(link.href, document.baseURI);\n    url.hash = '';\n    const registration = foresightManager.register({\n        element: link,\n        callback: () => {\n            if (!link.isConnected || !isEligibleLink(link)) return;\n            const currentUrl = new URL(link.href, document.baseURI);\n            currentUrl.hash = '';\n            prefetchWithForesight(link, currentUrl.href);\n        },\n        name: link.dataset.prefetchName || url.pathname,\n        reactivateAfter: PREFETCH_REACTIVATE_MS,\n    });\n    registeredLinks.set(link, { url: url.href, unregister: registration.unregister });\n}\n\nfunction flushRegistrations(deadline) {\n    registrationScheduled = false;\n    const started = performance.now();\n    let processed = 0;\n    for (const link of pendingRegistrations) {\n        pendingRegistrations.delete(link);\n        registerLink(link);\n        processed += 1;\n        if (\n            processed >= REGISTRATION_BATCH_SIZE ||\n            performance.now() - started >= REGISTRATION_BUDGET_MS ||\n            (deadline?.timeRemaining() ?? Infinity) <= 1\n        )\n            break;\n    }\n    scheduleRegistrations();\n}\n\nfunction scheduleRegistrations() {\n    if (registrationScheduled || !pendingRegistrations.size) return;\n    registrationScheduled = true;\n    scheduleWhenIdle(flushRegistrations);\n}\n\nfunction stopObservingRegistration(link) {\n    registrationObserver?.unobserve(link);\n    observedRegistrationLinks.delete(link);\n}\n\nfunction queueRegistration(link) {\n    if (!foresightManager || registeredLinks.has(link) || pendingRegistrations.has(link)) return;\n    if (typeof IntersectionObserver === 'undefined') {\n        pendingRegistrations.add(link);\n        scheduleRegistrations();\n        return;\n    }\n    if (observedRegistrationLinks.has(link)) return;\n    // The package synchronously measures each registered link. Native visibility\n    // keeps offscreen candidates out of that work while browser rules stay active.\n    registrationObserver ||= new IntersectionObserver((entries) => {\n        entries.forEach((entry) => {\n            if (!entry.target.isConnected) {\n                stopObservingRegistration(entry.target);\n                return;\n            }\n            if (!entry.isIntersecting) return;\n            stopObservingRegistration(entry.target);\n            pendingRegistrations.add(entry.target);\n        });\n        scheduleRegistrations();\n    });\n    observedRegistrationLinks.add(link);\n    registrationObserver.observe(link);\n}\n\nfunction refreshLink(link) {\n    if (!isEligibleLink(link)) {\n        pendingRegistrations.delete(link);\n        stopObservingRegistration(link);\n        link.removeAttribute(CANDIDATE_ATTRIBUTE);\n        link.removeAttribute(PREDICTED_ATTRIBUTE);\n        return;\n    }\n    const url = new URL(link.href, document.baseURI);\n    url.hash = '';\n    if (reactivatingUrls.has(url.href)) {\n        link.removeAttribute(CANDIDATE_ATTRIBUTE);\n    } else {\n        link.setAttribute(CANDIDATE_ATTRIBUTE, '');\n    }\n    queueRegistration(link);\n}\n\nfunction scanLinks(root = document) {\n    unregisterStaleLinks();\n    candidateLinks(root).forEach(refreshLink);\n}\n\nfunction observeLinkChanges() {\n    if (!('MutationObserver' in window)) return;\n    const observer = new MutationObserver((mutations) => {\n        const links = new Set();\n        let registrationsMayHaveChanged = false;\n        mutations.forEach(({ type, target, attributeName, addedNodes, removedNodes }) => {\n            if (type === 'attributes') {\n                if (!(target instanceof HTMLAnchorElement) && attributeName !== SKIP_ATTRIBUTE) {\n                    return;\n                }\n                registrationsMayHaveChanged = true;\n            } else if ([...removedNodes].some((node) => node instanceof Element)) {\n                registrationsMayHaveChanged = true;\n            }\n            const roots = type === 'childList' ? addedNodes : [target];\n            roots.forEach((root) => {\n                candidateLinks(root).forEach((link) => links.add(link));\n            });\n        });\n        // Text changes and inserted content cannot stale existing registrations.\n        if (registrationsMayHaveChanged) unregisterStaleLinks();\n        links.forEach(refreshLink);\n    });\n    observer.observe(document.documentElement, {\n        attributes: true,\n        childList: true,\n        subtree: true,\n        attributeFilter: ['href', 'target', 'rel', 'download', SKIP_ATTRIBUTE],\n    });\n}\n\nfunction scheduleWhenIdle(callback) {\n    if ('requestIdleCallback' in window) {\n        window.requestIdleCallback(callback, { timeout: 1500 });\n        return;\n    }\n    window.setTimeout(callback, 250);\n}\n\nfunction loadForesight() {\n    if (foresightLoadPromise || !supportsSpeculationRules() || backgroundWorkShouldBeSkipped()) {\n        return foresightLoadPromise;\n    }\n\n    foresightLoadPromise = import('js.foresight')\n        .then(({ ForesightManager }) => {\n            foresightManager = ForesightManager.initialize({\n                defaultHitSlop: 0,\n                enableScrollPrediction: false,\n                minimumConnectionType: '3g',\n                setDataAttributes: false,\n                tabOffset: 1,\n                touchDeviceStrategy: 'onTouchStart',\n                trajectoryPredictionTime: 80,\n            });\n            scanLinks();\n            document.dispatchEvent(new CustomEvent('zirbelino:foresight-ready'));\n        })\n        .catch(() => {\n            foresightLoadPromise = null;\n        });\n\n    return foresightLoadPromise;\n}\n\nfunction installLowPriorityLoadTriggers() {\n    const controller = new AbortController();\n    const schedule = () => {\n        controller.abort();\n        scheduleWhenIdle(() => void loadForesight());\n    };\n    const options = { passive: true, signal: controller.signal };\n\n    window.addEventListener('pointermove', schedule, options);\n    window.addEventListener('scroll', schedule, options);\n    window.addEventListener('touchmove', schedule, options);\n    window.addEventListener('keydown', schedule, {\n        signal: controller.signal,\n    });\n    const registerInteractedLink = (event) => {\n        const link = event.target.closest?.(`a[${CANDIDATE_ATTRIBUTE}]`);\n        if (!link || !foresightManager) return;\n        pendingRegistrations.delete(link);\n        stopObservingRegistration(link);\n        // A single interacted link bypasses the idle queue. Capture runs before\n        // Foresight's touch handlers, retaining prediction on the same input.\n        registerLink(link);\n    };\n    document.addEventListener('pointerover', registerInteractedLink, {\n        passive: true,\n        capture: true,\n    });\n    document.addEventListener('pointerdown', registerInteractedLink, {\n        passive: true,\n        capture: true,\n    });\n    document.addEventListener('focusin', registerInteractedLink, { capture: true });\n}\n\nexport function initNavigationPrefetch(root = document) {\n    // The fallback <link rel=\"prefetch\"> uses the HTTP cache, but shop HTML\n    // is deliberately no-store. Avoid downloading documents that cannot be reused.\n    if (!supportsSpeculationRules() || backgroundWorkShouldBeSkipped()) return;\n    scanLinks(root);\n    if (initialized) return;\n    initialized = true;\n\n    addSpeculationRules({\n        prefetch: [\n            {\n                where: {\n                    selector_matches: `a[${CANDIDATE_ATTRIBUTE}]:not([${SKIP_ATTRIBUTE}]):not([${SKIP_ATTRIBUTE}] *)`,\n                },\n                eagerness: 'moderate',\n            },\n            {\n                where: {\n                    selector_matches: `a[${CANDIDATE_ATTRIBUTE}][${PREDICTED_ATTRIBUTE}]:not([${SKIP_ATTRIBUTE}]):not([${SKIP_ATTRIBUTE}] *)`,\n                },\n                eagerness: 'immediate',\n            },\n        ],\n    });\n    observeLinkChanges();\n    installLowPriorityLoadTriggers();\n}\n","const cache = new Map();\n\nexport function initProductRatingPopover() {\n    let popover;\n    let activeTrigger;\n    let showTimer;\n    let hideTimer;\n    let generation = 0;\n    let touchShouldOpen = false;\n    let positionFrame = 0;\n    let anchor;\n    let popoverSize;\n    let resizeObserver;\n\n    const hide = () => {\n        window.clearTimeout(showTimer);\n        window.clearTimeout(hideTimer);\n        window.cancelAnimationFrame(positionFrame);\n        positionFrame = 0;\n        anchor = undefined;\n        if (!popover || popover.hidden) return;\n        popover.hidden = true;\n        popover.style.visibility = '';\n        activeTrigger?.removeAttribute('aria-expanded');\n        activeTrigger = undefined;\n        generation++;\n    };\n    const scheduleHide = () => {\n        window.clearTimeout(hideTimer);\n        hideTimer = window.setTimeout(hide, 180);\n    };\n    const measureAnchor = (trigger) => {\n        anchor = {\n            trigger,\n            rect: trigger.getBoundingClientRect(),\n            viewportWidth: window.innerWidth,\n            viewportHeight: window.innerHeight,\n        };\n    };\n    const applyPosition = () => {\n        if (!anchor || !popoverSize || popover.hidden || activeTrigger !== anchor.trigger) return;\n        if (!anchor.trigger.isConnected) {\n            hide();\n            return;\n        }\n        const { rect, viewportWidth, viewportHeight } = anchor;\n        const { width, height } = popoverSize;\n        const left = Math.max(8, Math.min(rect.left, viewportWidth - width - 8));\n        const below = rect.bottom + height + 8 <= viewportHeight || rect.top < height + 8;\n        const preferredTop = below ? rect.bottom + 8 : rect.top - height - 8;\n        const top = Math.max(8, Math.min(preferredTop, viewportHeight - height - 8));\n        if (popover.style.left !== `${left}px`) popover.style.left = `${left}px`;\n        if (popover.style.top !== `${top}px`) popover.style.top = `${top}px`;\n        if (popover.style.visibility) popover.style.visibility = '';\n    };\n    const position = () => {\n        if (positionFrame) return;\n        positionFrame = window.requestAnimationFrame(() => {\n            positionFrame = 0;\n            if (!activeTrigger || popover.hidden) return;\n            if (!activeTrigger.isConnected) {\n                hide();\n                return;\n            }\n            measureAnchor(activeTrigger);\n            if (!resizeObserver) {\n                popoverSize = { width: popover.offsetWidth, height: popover.offsetHeight };\n            }\n            applyPosition();\n        });\n    };\n    const ensurePopover = () => {\n        if (popover) return popover;\n        popover = document.createElement('div');\n        popover.id = 'z-product-rating-popover';\n        popover.className = 'z-product-rating-popover';\n        popover.setAttribute('role', 'region');\n        popover.setAttribute('aria-label', 'Bewertungsübersicht');\n        popover.hidden = true;\n        popover.addEventListener('pointerenter', () => window.clearTimeout(hideTimer));\n        popover.addEventListener('pointerleave', (event) => {\n            if (event.pointerType === 'mouse') scheduleHide();\n        });\n        popover.addEventListener('focusin', () => window.clearTimeout(hideTimer));\n        popover.addEventListener('focusout', (event) => {\n            if (!popover.contains(event.relatedTarget)) scheduleHide();\n        });\n        if ('ResizeObserver' in window) {\n            resizeObserver = new ResizeObserver(([entry]) => {\n                const box = entry.borderBoxSize?.[0] || entry.borderBoxSize;\n                const width = box?.inlineSize ?? popover.offsetWidth;\n                const height = box?.blockSize ?? popover.offsetHeight;\n                popoverSize = width > 0 && height > 0 ? { width, height } : undefined;\n                // The anchor was read before content writes. Native size delivery\n                // lets the panel appear in the right place before the first paint.\n                applyPosition();\n            });\n            resizeObserver.observe(popover, { box: 'border-box' });\n        }\n        document.body.append(popover);\n        return popover;\n    };\n    const show = async (trigger) => {\n        const rawUrl = trigger.dataset.ratingPopupUrl;\n        if (!rawUrl) return;\n        const url = new URL(rawUrl, window.location.href);\n        if (url.origin !== window.location.origin) return;\n        window.clearTimeout(hideTimer);\n        if (activeTrigger === trigger && popover && !popover.hidden) return;\n        activeTrigger?.removeAttribute('aria-expanded');\n        activeTrigger = trigger;\n        const currentGeneration = ++generation;\n        // Collect trigger geometry before inserting or changing panel content.\n        measureAnchor(trigger);\n        const panel = ensurePopover();\n        trigger.setAttribute('aria-controls', panel.id);\n        trigger.setAttribute('aria-expanded', 'true');\n        panel.style.visibility = 'hidden';\n        panel.innerHTML =\n            '<p class=\"z-product-rating-popover__status\">Bewertungen werden geladen …</p>';\n        panel.hidden = false;\n        if (resizeObserver) applyPosition();\n        else position();\n        try {\n            let pending = cache.get(url.href);\n            if (!pending) {\n                pending = fetch(url, {\n                    credentials: 'same-origin',\n                    headers: { Accept: 'text/html' },\n                })\n                    .then((response) => {\n                        if (!response.ok) throw new Error(`HTTP ${response.status}`);\n                        return response.text();\n                    })\n                    .catch((error) => {\n                        cache.delete(url.href);\n                        throw error;\n                    });\n                cache.set(url.href, pending);\n            }\n            const html = await pending;\n            if (generation !== currentGeneration || activeTrigger !== trigger) return;\n            panel.innerHTML = html;\n            if (resizeObserver) applyPosition();\n            else position();\n        } catch {\n            if (generation !== currentGeneration) return;\n            panel.innerHTML =\n                '<p class=\"z-product-rating-popover__status\">Bewertungen konnten nicht geladen werden.</p>';\n            if (resizeObserver) applyPosition();\n            else position();\n        }\n    };\n    const scheduleShow = (trigger) => {\n        window.clearTimeout(showTimer);\n        window.clearTimeout(hideTimer);\n        showTimer = window.setTimeout(() => {\n            if (trigger.isConnected) void show(trigger);\n        }, 250);\n    };\n\n    document.addEventListener('pointerover', (event) => {\n        const trigger = event.target.closest?.('[data-product-rating-popover]');\n        if (trigger && event.pointerType === 'mouse') scheduleShow(trigger);\n    });\n    document.addEventListener('pointerout', (event) => {\n        const trigger = event.target.closest?.('[data-product-rating-popover]');\n        if (trigger && event.pointerType === 'mouse' && !trigger.contains(event.relatedTarget))\n            scheduleHide();\n    });\n    document.addEventListener('focusin', (event) => {\n        const trigger = event.target.closest?.('[data-product-rating-popover]');\n        if (trigger) void show(trigger);\n    });\n    document.addEventListener('focusout', (event) => {\n        const trigger = event.target.closest?.('[data-product-rating-popover]');\n        if (trigger && !popover?.contains(event.relatedTarget)) scheduleHide();\n    });\n    document.addEventListener(\n        'pointerdown',\n        (event) => {\n            const trigger = event.target.closest?.('[data-product-rating-popover]');\n            touchShouldOpen = Boolean(\n                trigger &&\n                event.pointerType !== 'mouse' &&\n                (activeTrigger !== trigger || popover?.hidden),\n            );\n        },\n        true,\n    );\n    document.addEventListener(\n        'click',\n        (event) => {\n            const trigger = event.target.closest?.('[data-product-rating-popover]');\n            if (trigger && touchShouldOpen) {\n                event.preventDefault();\n                event.stopImmediatePropagation();\n                void show(trigger);\n            } else if (!trigger && !popover?.contains(event.target)) {\n                hide();\n            }\n            touchShouldOpen = false;\n        },\n        true,\n    );\n    document.addEventListener('keydown', (event) => {\n        if (event.key === 'Escape') hide();\n    });\n    window.addEventListener(\n        'scroll',\n        () => {\n            if (activeTrigger && popover && !popover.hidden) position();\n        },\n        { passive: true },\n    );\n    window.addEventListener('resize', hide);\n}\n","export function initLastviewedLogger() {\n    const marker = document.querySelector(\n        'script[type=\"application/json\"][data-lastviewed-logger]',\n    );\n    if (!marker || marker.dataset.lastviewedInitialized) return;\n\n    let productId;\n    try {\n        productId = JSON.parse(marker.textContent).product_id;\n    } catch {\n        return;\n    }\n    if (!Number.isSafeInteger(productId) || productId <= 0) return;\n    marker.dataset.lastviewedInitialized = 'true';\n\n    let logged = false;\n    let initializationPending = false;\n    let initializationFinished = false;\n    const logProductView = () => {\n        if (logged || initializationPending) return;\n        if ('prerendering' in document && document.prerendering) {\n            document.addEventListener('prerenderingchange', logProductView, { once: true });\n            return;\n        }\n        if (document.readyState !== 'complete') {\n            window.addEventListener('load', logProductView, { once: true });\n            return;\n        }\n\n        if (!initializationFinished && window.shopInitialization) {\n            initializationPending = true;\n            const resume = () => {\n                initializationPending = false;\n                initializationFinished = true;\n                logProductView();\n            };\n            // Beacon bypasses the shared fetch gate. Keep it in the same shop\n            // session, including when the activation handshake fails open.\n            Promise.resolve(window.shopInitialization).then(resume, resume);\n            return;\n        }\n        logged = true;\n        const config = window.siteIntegrationsConfig;\n        if (\n            config?.serverTracking?.recommendationEnabled === false ||\n            (config?.privateInitialization && config.serverTracking?.recommendationEnabled !== true)\n        )\n            return;\n        const endpoint = 'index.php?route=extension/module/lastviewed/loglv';\n        const body = new URLSearchParams({ product_id: String(productId) });\n        if (typeof navigator.sendBeacon === 'function') {\n            try {\n                if (navigator.sendBeacon(endpoint, body)) return;\n            } catch {\n                // Fall back when the browser cannot queue the beacon.\n            }\n        }\n\n        fetch(endpoint, {\n            method: 'POST',\n            headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n            credentials: 'same-origin',\n            keepalive: true,\n            body: body.toString(),\n        }).catch(() => {});\n    };\n\n    logProductView();\n}\n","import './styles/shared.css';\nimport { initDialogScrollLock } from '../template/components/common/dialog-scroll-lock/dialog-scroll-lock.js';\nimport { initSiteHeader } from '../template/components/home/site-header/site-header.js';\nimport { initCountrySwitcher } from '../template/components/home/country-switcher/country-switcher.js';\nimport { initMegaMenuOnDemand } from '../template/components/home/mega-menu/mega-menu-loader.js';\nimport { initAlgoliaSearch } from '../template/components/common/algolia-search/algolia-search.js';\nimport { initBackToTop } from '../template/components/common/back-to-top/back-to-top.js';\nimport { initCartFeedbackOnDemand } from '../template/components/common/cart-feedback/cart-feedback-loader.js';\nimport { initCartState } from '../template/components/common/cart-state/cart-state.js';\nimport { initFormUsability } from '../template/components/common/form-usability/form-usability.js';\nimport { initStorefrontTracking } from '../template/components/common/storefront-tracking/storefront-tracking.js';\nimport { initProductCards } from '../template/components/product-card/product-card.js';\nimport { initDragScrollOnDemand } from '../template/components/common/drag-scroll/drag-scroll-loader.js';\nimport { initBlazeSliders } from '../template/components/common/blaze-slider/blaze-slider-loader.js';\nimport { initNavigationPrefetch } from '../template/components/common/navigation-prefetch/navigation-prefetch.js';\nimport { initProductRatingPopover } from '../template/components/common/product-rating-popover/product-rating-popover.js';\nimport { initVideoVariants } from '../template/components/common/video-sources/video-sources.js';\nimport { initLastviewedLogger } from '../template/components/common/lastviewed/lastviewed.js';\ndocument.querySelectorAll('[data-site-header]').forEach((header) => {\n    initSiteHeader(header);\n    initCountrySwitcher(header);\n    initMegaMenuOnDemand(header);\n});\ndocument.querySelectorAll('[data-algolia-search]').forEach(initAlgoliaSearch);\ndocument.querySelectorAll('[data-back-to-top]').forEach(initBackToTop);\ndocument.querySelectorAll('[data-cart-feedback]').forEach(initCartFeedbackOnDemand);\ninitCartState();\ndocument.querySelectorAll('.zirbelino-surface form').forEach(initFormUsability);\ninitStorefrontTracking();\ninitProductCards();\ndocument.querySelectorAll('[data-drag-scroll]').forEach(initDragScrollOnDemand);\ndocument.querySelectorAll('.z-rich-text table').forEach(initDragScrollOnDemand);\ninitBlazeSliders();\ninitNavigationPrefetch();\ninitProductRatingPopover();\ninitVideoVariants();\ninitLastviewedLogger();\ninitDialogScrollLock();\n\ndocument.addEventListener('click', async (event) => {\n    const link = event.target.closest('[data-product-price-history]');\n    if (!link || typeof HTMLDialogElement === 'undefined') return;\n    event.preventDefault();\n    try {\n        const { openPriceHistory } =\n            await import('../template/components/product/product-price-history/product-price-history.js');\n        await openPriceHistory(link);\n    } catch {\n        window.location.assign(link.href);\n    }\n});\n\ndocument.addEventListener('zirbelino:wishlist:change', (event) => {\n    const productId = Number(event.detail?.productId);\n    const saved = event.detail?.saved === true;\n    if (!Number.isSafeInteger(productId) || productId <= 0) return;\n    document\n        .querySelectorAll('[data-catalog-wishlist], [data-product-wishlist]')\n        .forEach((button) => {\n            if (Number(button.dataset.productId || button.dataset.productWishlist) !== productId)\n                return;\n            button.classList.toggle('is-added', saved);\n            button.setAttribute(\n                'aria-label',\n                saved\n                    ? button.dataset.wishlistSavedLabel || 'Auf der Wunschliste'\n                    : button.dataset.wishlistAddLabel || 'Auf die Wunschliste setzen',\n            );\n        });\n});\n\ndocument.addEventListener('zirbelino:content-updated', (event) => {\n    const root = event.detail?.root;\n    if (!(root instanceof Element)) return;\n    root.querySelectorAll('form').forEach(initFormUsability);\n    root.querySelectorAll('[data-drag-scroll]').forEach(initDragScrollOnDemand);\n    root.querySelectorAll('.z-rich-text table').forEach(initDragScrollOnDemand);\n    initBlazeSliders(root);\n    initNavigationPrefetch(root);\n    initVideoVariants(root);\n});\n\nqueueMicrotask(() => {\n    document.dispatchEvent(new CustomEvent('zirbelino:ready'));\n});\n"],"file":"shared.js"}