{"version":3,"file":"design2024-DyBzQfds.js","sources":["../../../app/assets/javascripts/design2024/utility.js","../../../app/assets/javascripts/design2024/store-header.js","../../../app/assets/javascripts/design2024/main-menu.js","../../../app/assets/javascripts/design2024/slider.js","../../../app/assets/javascripts/design2024/predictive-search.js","../../../app/assets/javascripts/design2024/search-form.js"],"sourcesContent":["window.theme = {\n info: {\n name: 'Enterprise',\n version: '1.3.1'\n },\n mediaQueries: {\n sm: '(min-width: 600px)',\n md: '(min-width: 769px)',\n lg: '(min-width: 1024px)',\n xl: '(min-width: 1280px)',\n xxl: '(min-width: 1536px)',\n portrait: '(orientation: portrait)'\n },\n device: {\n hasTouch: window.matchMedia('(any-pointer: coarse)').matches,\n hasHover: window.matchMedia('(hover: hover)').matches\n },\n settings: {\n moneyWithCurrencyFormat: \"${{amount}} USD\",\n pSearchLimit: 10,\n pSearchLimitScope: 'each',\n pSearchIncludeSkus: false,\n pSearchIncludeTags: true,\n pSearchShowArticles: true,\n pSearchShowCollections: true,\n pSearchShowPages: true,\n pSearchShowProducts: true,\n pSearchShowSuggestions: true,\n sliderItemsPerNav: 'slide',\n \n vibrateOnATC: true,\n compareToggle: \"toggle_off\",\n compareShowEmptyMetafields: false,\n blendProductImages: false,\n externalLinksNewTab: true,\n afterAtc: \"nothing\",\n cartType: \"page\"\n },\n strings: {\n addCartNote: 'Add order note',\n editCartNote: 'Edit order note',\n cartError: 'There was an error while updating your cart. Please try again.',\n cartQtyError: 'You can only add [quantity] of this item to your cart.',\n cartTermsConfirmation: 'You must agree to the terms and conditions before continuing.',\n imageAvailable: 'Image [index] is now available in gallery view',\n lowStock: 'Low stock',\n inStock: 'In stock',\n noStock: 'Sold out',\n noVariant: 'Unavailable',\n onlyXLeft: '[quantity] in stock',\n awaitingSale: 'This product is not for sale yet.',\n shippingCalculator: {\n singleRate: 'There is one shipping rate for this destination:',\n multipleRates: 'There are multiple shipping rates for this destination:',\n noRates: 'We do not ship to this destination.'\n },\n viewDetails: 'View details',\n compare: {\n limit: 'You can only add a maximum of [quantity] products to compare.',\n more: 'Select another product to compare.',\n empty: 'Select at least two products to compare.',\n continue: 'Close to continue.'\n },\n discountCopyFail: 'Could not copy code to clipboard. Your browser may not support this.',\n articleReadTime: '[x] minute read',\n quickNav: {\n button_standard: 'Search',\n show_products_none: 'No products :(',\n button_one: 'Show [quantity] product',\n button_other: 'Show [quantity] products',\n },\n },\n routes: {\n predictiveSearch: '/products/autocomplete'\n }\n };\n\n(() => {\n const { mediaQueries } = theme;\n if (!mediaQueries) return;\n\n const mqKeys = Object.keys(mediaQueries);\n const mqLists = {};\n theme.mediaMatches = {};\n\n /**\n * Handles a media query (breakpoint) change.\n */\n const handleMqChange = () => {\n const newMatches = mqKeys.reduce((acc, media) => {\n acc[media] = !!(mqLists[media] && mqLists[media].matches);\n return acc;\n }, {});\n\n // Update mediaMatches values after breakpoint change.\n Object.keys(newMatches).forEach((key) => {\n theme.mediaMatches[key] = newMatches[key];\n });\n\n window.dispatchEvent(new CustomEvent('on:breakpoint-change'));\n };\n\n mqKeys.forEach((mq) => {\n // Create mqList object for each media query.\n mqLists[mq] = window.matchMedia(mediaQueries[mq]);\n\n // Get initial matches for each query.\n theme.mediaMatches[mq] = mqLists[mq].matches;\n\n // Add an event listener to each query.\n try {\n mqLists[mq].addEventListener('change', handleMqChange);\n } catch (err1) {\n // Fallback for legacy browsers (Safari < 14).\n mqLists[mq].addListener(handleMqChange);\n }\n });\n})();\n\n/**\n * Returns a function that as long as it continues to be invoked, won't be triggered.\n * @param {Function} fn - Callback function.\n * @param {number} [wait=300] - Delay (in milliseconds).\n * @returns {Function}\n */\nif (!window.debounce) {\n window.debounce = function(fn, wait = 300) {\n let t;\n return (...args) => {\n clearTimeout(t);\n t = setTimeout(() => fn.apply(this, args), wait);\n };\n }\n}\n\n/**\n * Sets a 'viewport-height' custom property on the root element.\n */\nif (!window.setViewportHeight) {\n window.setViewportHeight = function() {\n document.documentElement.style.setProperty('--viewport-height', `${window.innerHeight}px`);\n }\n}\n\n/**\n * Sets a 'header-height' custom property on the root element.\n */\nif (!window.setHeaderHeight) {\n window.setHeaderHeight = function() {\n const header = document.getElementById('em-section-header');\n if (!header) return;\n let height = header.offsetHeight;\n\n // Add announcement bar height (if shown).\n const announcement = document.getElementById('em-section-announcement');\n if (announcement) height += announcement.offsetHeight;\n\n document.documentElement.style.setProperty('--header-height', `${height}px`);\n }\n}\n\n/**\n * Sets a 'scrollbar-width' custom property on the root element.\n */\nif (!window.setScrollbarWidth) {\n window.setScrollbarWidth = function() {\n document.documentElement.style.setProperty(\n '--scrollbar-width',\n `${window.innerWidth - document.documentElement.clientWidth}px`\n );\n }\n}\n\n/**\n * Sets the dimension variables.\n */\nfunction setDimensionVariables() {\n setViewportHeight();\n setHeaderHeight();\n setScrollbarWidth();\n}\n\n// Set the dimension variables.\nsetDimensionVariables();\n\n// Update the dimension variables if viewport resized.\nwindow.addEventListener('resize', window.debounce(setDimensionVariables, 50));\n","if (!customElements.get('store-header')) {\n class StoreHeader extends HTMLElement {\n constructor() {\n super();\n this.menu = this.querySelector('.main-menu__content');\n this.searchToggle = this.querySelector('.js-show-search');\n this.searchToggleLeft = this.querySelector('.js-show-search-left');\n this.mobNavToggle = this.querySelector('.main-menu__toggle');\n this.shakeyCartIcon = this.querySelector('.header__icon--cart-shake');\n this.headerGroupSections = document.querySelectorAll('.shopify-section-group-header-group');\n\n this.stickyInitialised = false;\n this.stickyTransitioning = false;\n this.lastScrollPos = 0;\n\n this.headerTransitionSpeed = parseFloat(\n getComputedStyle(this).getPropertyValue('--header-transition-speed')\n );\n\n window.setHeaderHeight();\n this.bindEvents();\n this.init();\n }\n\n disconnectedCallback() {\n window.removeEventListener('on:debounced-resize', this.resizeHandler);\n if (this.breakpointChangeHandler) {\n window.removeEventListener('on:breakpoint-change', this.breakpointChangeHandler);\n }\n }\n\n bindEvents() {\n this.resizeHandler = this.resizeHandler || this.updateHeaderHeights.bind(this);\n window.addEventListener('on:debounced-resize', this.resizeHandler);\n\n if (this.mobNavToggle) {\n this.mobNavToggle.addEventListener('click', window.setHeaderHeight);\n this.mobNavToggle.addEventListener('click', this.setHeaderEnd.bind(this));\n }\n\n if (this.dataset.isSticky) {\n this.breakpointChangeHandler = this.breakpointChangeHandler || this.init.bind(this);\n window.addEventListener('on:breakpoint-change', this.breakpointChangeHandler);\n }\n\n if (this.dataset.isSearchMinimised) {\n if (this.searchToggle) {\n this.searchToggle.addEventListener('click', this.handleSearchToggleClick.bind(this));\n }\n\n if (this.searchToggleLeft) {\n this.searchToggleLeft.addEventListener('click', this.handleSearchToggleClick.bind(this));\n }\n }\n }\n\n /**\n * Init sticky behaviour of the header\n */\n init() {\n this.updateHeaderHeights();\n\n if (this.dataset.isSticky) {\n if (theme.mediaMatches.md && !this.stickyInitialised) {\n this.stickyInitialised = true;\n // Animate the menu in/out on scroll up/down\n window.addEventListener('scroll', this.handleScroll.bind(this));\n }\n\n setTimeout(() => {\n let ccHeader = document.querySelector('.cc-header')\n if (ccHeader) {\n ccHeader.classList.add('cc-header--sticky');\n }\n });\n\n this.setMenuHeight();\n this.setHeaderEnd();\n }\n\n // Stop the cart icon from shaking when necessary\n if (this.shakeyCartIcon) {\n let pageCount = theme.storageUtil.get('shake-page-count', false, true);\n pageCount = pageCount ? parseInt(pageCount, 10) + 1 : 1;\n const shakeFrequency = parseInt(this.shakeyCartIcon.dataset.shakeFrequency, 10);\n if (pageCount < shakeFrequency) {\n this.shakeyCartIcon.classList.remove('header__icon--cart-shake');\n } else {\n pageCount = 0;\n }\n theme.storageUtil.set('shake-page-count', pageCount, true);\n }\n }\n\n /**\n * Toggles visibility of the search bar\n * @param {object} evt - Event object\n */\n handleSearchToggleClick(evt) {\n evt.preventDefault();\n const searchBar = this.querySelector('.js-search-bar');\n if (this.classList.contains('search-is-collapsed')) {\n this.classList.remove('search-is-collapsed');\n\n // Wait for reveal animation to complete\n setTimeout(() => {\n this.classList.add('search-is-visible');\n const searchInput = searchBar.querySelector('.js-search-input');\n searchInput.focus();\n window.setHeaderHeight();\n }, this.headerTransitionSpeed);\n } else {\n this.classList.remove('search-is-visible');\n\n setTimeout(() => {\n this.classList.add('search-is-collapsed');\n });\n\n setTimeout(window.setHeaderHeight, this.headerTransitionSpeed);\n }\n }\n\n /**\n * Wrapper for calling the two below\n */\n updateHeaderHeights() {\n if (theme.mediaMatches.md) {\n this.setMenuHeight();\n setTimeout(window.setHeaderHeight, this.headerTransitionSpeed);\n } else {\n window.setHeaderHeight();\n }\n\n // Set a css variable to record where the page content starts\n if (this.headerGroupSections && this.headerGroupSections.length > 0) {\n let headerGroupHeight = 0;\n this.headerGroupSections.forEach((section) => {\n headerGroupHeight += section.getBoundingClientRect().height;\n });\n\n if (headerGroupHeight > 0) {\n document.documentElement.style.setProperty(\n '--content-start',\n `${headerGroupHeight.toFixed(1)}px`\n );\n }\n }\n }\n\n /**\n * Set a css variable to the height of the menu links\n */\n setMenuHeight() {\n if (this.menu && this.menu.clientHeight) {\n this.style.setProperty('--menu-height', `${this.menu.clientHeight + 16}px`);\n document.documentElement.style.setProperty('--header-height', `${this.clientHeight}px`);\n }\n }\n\n /**\n * Handles 'scroll' event on the header\n */\n handleScroll() {\n if (!document.body.classList.contains('fixed') && !this.stickyTransitioning) {\n if (document.documentElement.scrollTop < 200) {\n this.show();\n } else if (this.lastScrollPos < document.documentElement.scrollTop) {\n this.hide();\n } else if (this.lastScrollPos - 5 > document.documentElement.scrollTop) {\n this.show();\n }\n\n this.lastScrollPos = document.documentElement.scrollTop;\n }\n }\n\n /**\n * Set a css variable to indicate where the nav ends on the page\n */\n setHeaderEnd() {\n const headerEnd = Number(this.getBoundingClientRect().top + this.clientHeight);\n document.documentElement.style.setProperty('--header-end', `${headerEnd.toFixed(1)}px`);\n document.documentElement.style.setProperty(\n '--header-end-padded',\n `${(headerEnd + (theme.mediaMatches.md ? 56 : 20)).toFixed(1)}px`\n );\n }\n\n /**\n * Updates hidden class for header element\n */\n show() {\n this.classList.remove('is-out');\n this.stickyTransitioning = true;\n setTimeout(() => {\n this.lastScrollPos = document.documentElement.scrollTop;\n this.stickyTransitioning = false;\n this.handleScroll();\n this.setHeaderEnd();\n }, 300);\n }\n\n /**\n * Updates hidden class for header element\n */\n hide() {\n if (!this.stickyTransitioning) {\n this.classList.add('is-out');\n this.stickyTransitioning = true;\n setTimeout(() => {\n this.lastScrollPos = document.documentElement.scrollTop;\n this.stickyTransitioning = false;\n this.handleScroll();\n this.setHeaderEnd();\n }, 300);\n }\n }\n }\n\n customElements.define('store-header', StoreHeader);\n}","const trapFocusHandlers = {};\n\n/**\n * Removes focus trap event listeners and optionally focuses an element.\n * @param {Element} [elementToFocus=null] - Element to focus when trap is removed.\n */\nfunction removeTrapFocus(elementToFocus = null) {\n document.removeEventListener('focusin', trapFocusHandlers.focusin);\n document.removeEventListener('focusout', trapFocusHandlers.focusout);\n document.removeEventListener('keydown', trapFocusHandlers.keydown);\n\n if (elementToFocus) elementToFocus.focus();\n}\n\n/**\n * Traps focus within a container, e.g. modal or side drawer.\n * @param {Element} container - Container element to trap focus within.\n * @param {Element} [elementToFocus=container] - Initial element to focus when trap is applied.\n */\nfunction trapFocus(container, elementToFocus = container) {\n const focusableEls = Array.from(\n container.querySelectorAll('summary, a[href], area[href], button:not([disabled]), input:not([type=hidden]):not([disabled]), select:not([disabled]), textarea:not([disabled]), object, iframe, audio[controls], video[controls], [tabindex]:not([tabindex^=\"-\"])')\n );\n\n const firstEl = focusableEls[0];\n const lastEl = focusableEls[focusableEls.length - 1];\n\n removeTrapFocus();\n\n trapFocusHandlers.focusin = (evt) => {\n if (evt.target !== container && evt.target !== lastEl && evt.target !== firstEl) return;\n document.addEventListener('keydown', trapFocusHandlers.keydown);\n };\n\n trapFocusHandlers.focusout = () => {\n document.removeEventListener('keydown', trapFocusHandlers.keydown);\n };\n\n trapFocusHandlers.keydown = (evt) => {\n if (evt.code !== 'Tab') return;\n\n // If tab pressed on last focusable element, focus the first element.\n if (evt.target === lastEl && !evt.shiftKey) {\n evt.preventDefault();\n firstEl.focus();\n }\n\n // If shift + tab pressed on the first focusable element, focus the last element.\n if ((evt.target === container || evt.target === firstEl) && evt.shiftKey) {\n evt.preventDefault();\n lastEl.focus();\n }\n };\n\n document.addEventListener('focusout', trapFocusHandlers.focusout);\n document.addEventListener('focusin', trapFocusHandlers.focusin);\n\n (elementToFocus || container).focus();\n}\n\nif (!customElements.get('main-menu')) {\n class MainMenu extends HTMLElement {\n constructor() {\n super();\n this.mainDisclosure = this.querySelector('.main-menu__disclosure');\n this.mainToggle = this.querySelector('.main-menu__toggle');\n this.firstLevelMenuLinks = this.querySelectorAll('.js-nav-hover');\n this.firstLevelSingleLinks = this.querySelectorAll('.main-nav__item--primary:not(.main-nav__item-content)');\n this.nav = this.querySelector('.main-nav');\n this.overlay = document.querySelector('.js-overlay');\n this.searchIcon = document.querySelector('.header__icons .js-show-search');\n this.sidebarLinks = this.querySelectorAll('.js-sidebar-hover');\n this.elementsWhichCloseMenus = document.querySelectorAll('.js-closes-menu');\n this.childNavLinks = this.querySelectorAll('.child-nav__li');\n\n this.childNavOpen = false;\n this.overlayOpen = false;\n\n this.addListeners();\n this.init();\n }\n\n disconnectedCallback() {\n window.removeEventListener('focusin', this.focusOutHandler);\n window.removeEventListener('on:breakpoint-change', this.breakpointChangeHandler);\n }\n\n addListeners() {\n this.focusOutHandler = this.focusOutHandler || this.handleFocusOut.bind(this);\n this.breakpointChangeHandler = this.breakpointChangeHandler || this.init.bind(this);\n\n if (this.mainDisclosure) {\n this.mainDisclosure.addEventListener('transitionend', MainMenu.handleTransition.bind(this));\n }\n if (this.mainToggle) {\n this.mainToggle.addEventListener('click', this.handleMainMenuToggle.bind(this));\n }\n if (this.nav) {\n this.nav.addEventListener('click', MainMenu.handleNavClick.bind(this));\n }\n window.addEventListener('focusin', this.focusOutHandler);\n window.addEventListener('on:breakpoint-change', this.breakpointChangeHandler);\n\n if (!theme.mediaMatches.md && this.searchIcon) {\n this.searchIcon.addEventListener('click', this.closeMainDisclosure.bind(this));\n }\n }\n\n /**\n * Sets 'open' state of the main disclosure element.\n * @param {?object} evt - Event object.\n */\n init(evt) {\n if (!evt) {\n if (this.mainDisclosure) {\n this.mainDisclosure.open = theme.mediaMatches.md;\n }\n } else if (!theme.mediaMatches.md && !this.childNavOpen) {\n if (this.mainDisclosure) {\n this.close(this.mainDisclosure);\n }\n\n if (this.overlayOpen) this.toggleOverlay(false);\n } else {\n // If there's another menu open, close it.\n if (this.nav) {\n const activeDisclosure = this.nav.querySelector('details.is-open');\n if (activeDisclosure) {\n this.close(activeDisclosure);\n } else {\n if (this.mainDisclosure) {\n MainMenu.open(this.mainDisclosure, false);\n }\n }\n }\n\n if (!this.childNavOpen) {\n if (this.overlayOpen) this.toggleOverlay(false);\n }\n }\n\n // Close the submenus (they're open for no-js)\n this.querySelectorAll('.child-nav--dropdown details[open]').forEach((childToggle) => {\n childToggle.removeAttribute('open');\n });\n \n if(theme.mediaMatches.md) {\n this.querySelectorAll('.child-nav details').forEach((childToggle) => {\n childToggle.setAttribute('open', true);\n });\n }\n\n if (theme.device.hasHover) {\n // Add event handler (so the bound event listener can be removed)\n this.mouseEnterMenuLinkHandler = this.mouseEnterMenuLinkHandler\n || this.handleMouseEnterMenuLink.bind(this);\n this.mouseLeaveMenuLinkHandler = this.mouseLeaveMenuLinkHandler\n || this.handleMouseLeaveMenuLink.bind(this);\n this.mouseEnterSingleLinkHandler = this.mouseEnterSingleLinkHandler\n || this.handleMouseEnterSingleLink.bind(this);\n this.mouseLeaveSingleLinkHandler = this.mouseLeaveSingleLinkHandler\n || this.handleMouseLeaveSingleLink.bind(this);\n this.mouseEnterMenuCloserHandler = this.mouseEnterMenuCloserHandler\n || this.handleClose.bind(this);\n this.mouseEnterChildNavHandler = this.mouseEnterChildNavHandler\n || this.handleMouseEnterChildNav.bind(this);\n this.mouseLeaveChildNavHandler = this.mouseLeaveChildNavHandler\n || this.handleMouseLeaveChildNav.bind(this);\n\n // Bind listening events for mouse enter/leave a main menu link\n if (!this.mouseOverListening && theme.mediaMatches.md) {\n this.firstLevelMenuLinks.forEach((menuLink) => {\n menuLink.addEventListener('mouseenter', this.mouseEnterMenuLinkHandler);\n menuLink.addEventListener('mouseleave', this.mouseLeaveMenuLinkHandler);\n });\n this.firstLevelSingleLinks.forEach((singleLink) => {\n singleLink.addEventListener('mouseenter', this.mouseEnterSingleLinkHandler);\n singleLink.addEventListener('mouseleave', this.mouseLeaveSingleLinkHandler);\n });\n this.elementsWhichCloseMenus.forEach((elem) => {\n elem.addEventListener('mouseenter', this.mouseEnterMenuCloserHandler);\n });\n this.mouseOverListening = true;\n } else if (this.mouseOverListening && !theme.mediaMatches.md) {\n this.firstLevelMenuLinks.forEach((menuLink) => {\n menuLink.removeEventListener('mouseenter', this.mouseEnterMenuLinkHandler);\n menuLink.removeEventListener('mouseleave', this.mouseLeaveMenuLinkHandler);\n });\n this.firstLevelSingleLinks.forEach((singleLink) => {\n singleLink.removeEventListener('mouseenter', this.mouseEnterSingleLinkHandler);\n singleLink.removeEventListener('mouseleave', this.mouseLeaveSingleLinkHandler);\n });\n this.elementsWhichCloseMenus.forEach((elem) => {\n elem.removeEventListener('mouseenter', this.mouseEnterMenuCloserHandler);\n });\n this.mouseOverListening = false;\n }\n\n if (this.sidebarLinks) {\n if (!this.mouseOverSidebarListening && theme.mediaMatches.md) {\n this.sidebarLinks.forEach((sidebarLink) => {\n sidebarLink.addEventListener('mouseenter', MainMenu.handleSidenavMenuToggle);\n });\n this.mouseOverSidebarListening = true;\n } else if (this.mouseOverSidebarListening && !theme.mediaMatches.md) {\n this.sidebarLinks.forEach((sidebarLink) => {\n sidebarLink.removeEventListener('mouseenter', MainMenu.handleSidenavMenuToggle);\n });\n this.mouseOverSidebarListening = false;\n }\n }\n\n if (this.childNavLinks) {\n if (!this.mouseOverChildNavListening && theme.mediaMatches.md) {\n this.childNavLinks.forEach((childNavLink) => {\n childNavLink.addEventListener('mouseenter', this.mouseEnterChildNavHandler);\n childNavLink.addEventListener('mouseleave', this.mouseLeaveChildNavHandler);\n });\n this.mouseOverChildNavListening = true;\n } else if (this.mouseOverChildNavListening && !theme.mediaMatches.md) {\n this.childNavLinks.forEach((childNavLink) => {\n childNavLink.removeEventListener('mouseenter', this.mouseEnterChildNavHandler);\n childNavLink.removeEventListener('mouseleave', this.mouseLeaveChildNavHandler);\n });\n this.mouseOverChildNavListening = false;\n }\n\n }\n }\n }\n\n /**\n * Close the menu if the nav loses focus\n * @param {object} evt - Event object.\n */\n handleFocusOut(evt) {\n if (!this.contains(evt.target) && this.overlayOpen) this.handleClose();\n }\n\n /**\n * Updates the visible sidebar item\n * @param {object} evt - Event object.\n * @param {Element} [summaryElem] - The summary element to open.\n */\n static handleSidenavMenuToggle(evt, summaryElem = evt.target) {\n const container = summaryElem.closest('.child-nav');\n const lastSidenavElem = container.querySelector('.is-visible');\n if (lastSidenavElem) {\n lastSidenavElem.classList.remove('is-visible');\n }\n summaryElem.classList.add('is-visible');\n\n // Maintain a CSS variable which records the height of the current sidebar links\n const menu = summaryElem.closest('nav-menu');\n if (menu) {\n const openDisclosure = menu.querySelector('.disclosure__panel');\n if (openDisclosure) {\n container.style.setProperty(\n '--sidebar-height',\n `${Number.parseInt(openDisclosure.getBoundingClientRect().height, 10)}px`\n );\n }\n }\n }\n\n /**\n * Handles 'toggle' event on the main disclosure element.\n * @param {object} evt - Event object.\n */\n handleMainMenuToggle(evt) {\n evt.preventDefault();\n this.opener = this.mainToggle;\n\n if (!this.mainDisclosure) {\n return;\n }\n\n if (!this.mainDisclosure.open) {\n MainMenu.open(this.mainDisclosure);\n } else {\n this.close(this.mainDisclosure, true);\n }\n }\n\n /**\n * Handles 'mouseenter' event on the main menu items using a timeout to infer hover intent\n * @param {object} evt - Event object\n */\n handleMouseEnterMenuLink(evt) {\n this.menuLinkTimeout = setTimeout(\n this.openMenuFromMouseEnter.bind(this, evt.target),\n Number.parseInt(this.dataset.menuSensitivity, 10)\n );\n }\n\n /**\n * Handles 'mouseleave' event on the main menu items - clears the timeout\n */\n handleMouseLeaveMenuLink() {\n if (this.menuLinkTimeout) clearTimeout(this.menuLinkTimeout);\n }\n\n /**\n * Handles 'mouseenter' event on links with no submenu items using a timeout to infer hover intent\n */\n handleMouseEnterSingleLink() {\n this.singleLinkTimeout = setTimeout(() => {\n this.handleClose();\n }, Number.parseInt(this.dataset.menuSensitivity, 10));\n }\n\n /**\n * Handles 'mouseleave' event on links with no submenu - clears the timeout\n */\n handleMouseLeaveSingleLink() {\n if (this.singleLinkTimeout) clearTimeout(this.singleLinkTimeout);\n }\n\n handleMouseEnterChildNav(evt) {\n this.childNavTimeout = setTimeout(\n this.openChildNavFromMouseEnter.bind(this, evt.target),\n Number.parseInt(this.dataset.menuSensitivity, 10)\n );\n }\n\n handleMouseLeaveChildNav() {\n if (this.childNavTimeout) clearTimeout(this.childNavTimeout);\n }\n\n openChildNavFromMouseEnter(navElem) {\n if (this.nav) {\n const activeDisclosure = this.nav.querySelector('details.is-open');\n if(!navElem.classList.contains('is-open')) {\n const activeChildNav = activeDisclosure.querySelector('.child-nav__li.is-open');\n\n if (activeChildNav && activeChildNav !== navElem) {\n this.closeNav(activeDisclosure, activeChildNav);\n }\n }\n\n this.openNav(activeDisclosure, navElem);\n }\n }\n\n openNav(activeDisclosure, navElem) {\n navElem.classList.add(\"is-open\");\n let navid = navElem.dataset.navid;\n let childMenu = activeDisclosure.querySelector('.child-menus-'+navid);\n let childPromo = activeDisclosure.querySelector('.child-promos-'+navid);\n if(childMenu) childMenu.classList.remove(\"hidden\");\n if(childPromo) childPromo.classList.remove(\"hidden\");\n }\n\n closeNav(activeDisclosure, activeChildNav) {\n activeChildNav.classList.remove('is-open');\n let navid = activeChildNav.dataset.navid;\n let childMenu = activeDisclosure.querySelector('.child-menus-'+navid);\n let childPromo = activeDisclosure.querySelector('.child-promos-'+navid);\n if(childMenu) childMenu.classList.add(\"hidden\");\n if(childPromo) childPromo.classList.add(\"hidden\");\n }\n\n /**\n * Opens the menu being hovered over\n * @param {Element} menuElem - The menu element to open.\n */\n openMenuFromMouseEnter(menuElem) {\n trapFocus(menuElem);\n\n const disclosure = menuElem.closest('details');\n if (!disclosure.classList.contains('is-open') && this.nav) {\n const activeDisclosure = this.nav.querySelector('details.is-open');\n\n // If there's another menu open, close it.\n if (activeDisclosure && activeDisclosure !== disclosure) {\n this.close(activeDisclosure);\n } else {\n this.toggleOverlay(!this.overlayOpen);\n }\n\n MainMenu.open(disclosure);\n }\n }\n\n /**\n * Handles 'click' event on the nav.\n * @param {object} evt - Event object.\n */\n static handleNavClick(evt) {\n const mainMenuContent = evt.target.closest('.main-menu__content');\n let el = evt.target;\n\n // Handle sidebar link clicks\n if (theme.mediaMatches.md && el.matches('.js-sidebar-hover') && el.closest('summary')) {\n evt.preventDefault();\n MainMenu.handleSidenavMenuToggle(evt);\n }\n\n // Don't follow # links\n if (evt.target.href && evt.target.href.endsWith('#')) evt.preventDefault();\n\n // If we're on a device without hover on a larger screen, open the menu\n if (theme.mediaMatches.md && !theme.device.hasHover) {\n el = evt.target.closest('.js-toggle');\n if (!el) return;\n }\n\n if (!el.matches('.js-toggle,.js-back')) return;\n\n const disclosure = el.closest('details');\n\n if (theme.mediaMatches.md && theme.device.hasHover) {\n disclosure.classList.toggle('is-open');\n return;\n }\n\n this.opener = el;\n\n if (el.matches('.js-toggle')) {\n evt.preventDefault();\n\n if (!theme.mediaMatches.md) {\n mainMenuContent.classList.add('main-menu__content--no-focus');\n }\n\n if (!disclosure.classList.contains('is-open') && this.nav) {\n this.childNavOpen = true;\n\n const activeDisclosure = this.nav.querySelector('details.is-open');\n // If there's another menu open, close it.\n if (activeDisclosure && activeDisclosure !== disclosure) {\n this.close(activeDisclosure);\n } else if (theme.mediaMatches.md) {\n this.toggleOverlay(!this.overlayOpen);\n }\n\n MainMenu.open(disclosure);\n } else {\n this.close(disclosure, true);\n this.childNavOpen = false;\n this.toggleOverlay(false);\n }\n } else if (el.matches('.js-back')) {\n evt.preventDefault();\n this.close(disclosure, true);\n this.childNavOpen = false;\n\n if (!theme.mediaMatches.md) {\n mainMenuContent.classList.remove('main-menu__content--no-focus');\n }\n }\n }\n\n /**\n * Handles 'transitionend' event on the nav.\n * @param {object} evt - Event object.\n */\n static handleTransition(evt) {\n const disclosure = evt.target.closest('details');\n\n if (disclosure.classList.contains('is-closing')) {\n disclosure.classList.remove('is-closing');\n disclosure.open = false;\n\n removeTrapFocus();\n this.opener = null;\n }\n }\n\n /**\n * Handles a 'click' event on the overlay and a 'keyup' event on the nav.\n * @param {object} evt - Event object.\n */\n handleClose(evt) {\n if (evt && evt.type === 'keyup' && evt.key !== 'Escape') return;\n\n const disclosure = (theme.mediaMatches.md && this.nav)\n ? this.nav.querySelector('details.is-open')\n : this.mainDisclosure;\n\n if (disclosure) {\n this.close(disclosure, true);\n this.toggleOverlay(false);\n this.childNavOpen = false;\n }\n }\n\n /**\n * Toggles visibility of the background overlay.\n * @param {boolean} show - Show the overlay.\n */\n toggleOverlay(show) {\n this.overlay = document.querySelector('.js-overlay');\n this.overlayOpen = show;\n this.overlay.classList.toggle('overlay--nav', show);\n this.overlay.classList.toggle('is-visible', show);\n\n if (show) {\n // Add event handler (so the bound event listener can be removed).\n this.closeHandler = this.closeHandler || this.handleClose.bind(this);\n\n // Add event listeners (for while the nav is open).\n this.overlay.addEventListener('click', this.closeHandler);\n this.nav.addEventListener('keyup', this.closeHandler);\n\n if (theme.mediaMatches.md) {\n this.overlay.addEventListener('mouseenter', this.closeHandler);\n }\n } else {\n // Remove event listener added on nav opening.\n this.overlay.removeEventListener('click', this.closeHandler);\n this.nav.removeEventListener('keyup', this.closeHandler);\n\n if (theme.mediaMatches.md) {\n this.overlay.removeEventListener('mouseenter', this.closeHandler);\n }\n }\n }\n\n /**\n * Closes the main nav menu\n */\n closeMainDisclosure() {\n if (this.mainDisclosure && this.mainDisclosure.classList.contains('is-open')) {\n this.close(this.mainDisclosure, true);\n this.toggleOverlay(false);\n this.childNavOpen = false;\n }\n }\n\n /**\n * Updates open/opening classes for disclosure element.\n * @param {Element} el - Disclosure element.\n * @param {boolean} [mainMenuOpen=true] - Main menu is open.\n */\n static open(el, mainMenuOpen = true) {\n el.open = true;\n\n // Cap the max width of grandchildren on desktop their contents don't widen the dropdown\n if (theme.mediaMatches.md && !el.classList.contains('js-mega-nav')) {\n // If the nav menu spills off the right of the screen, shift it to the left\n const dropdownContainer = el.querySelector('.main-nav__child');\n if (dropdownContainer.getBoundingClientRect().right > window.innerWidth) {\n dropdownContainer.classList.add('main-nav__child--offset-right');\n }\n\n const dropdown = el.querySelector('.child-nav--dropdown');\n if (dropdown) {\n dropdown.querySelectorAll('.main-nav__grandchild').forEach((grandchildElem) => {\n grandchildElem.style.maxWidth = `${dropdown.clientWidth}px`;\n });\n }\n } else if (theme.mediaMatches.md && el.querySelector('.mega-nav--sidebar')) {\n const firstSummaryElem = el.querySelector('.mega-nav--sidebar details[open] summary');\n if (firstSummaryElem) {\n // Open the first sidebar mega menu\n MainMenu.handleSidenavMenuToggle(null, firstSummaryElem);\n }\n }\n\n // Slight delay required before starting transitions.\n setTimeout(() => {\n el.classList.remove('is-closing');\n el.classList.add('is-open');\n });\n\n if (mainMenuOpen) {\n removeTrapFocus();\n trapFocus(el);\n\n if (theme.mediaMatches.md || el.classList.contains('main-menu__disclosure')) {\n document.body.classList.add('overflow-hidden');\n }\n }\n }\n\n /**\n * Updates close/closing classes of a disclosure element.\n * @param {Element} el - Disclosure element.\n * @param {boolean} [transition=false] - Close action has a CSS transition.\n */\n close(el, transition = true) {\n el.classList.remove('is-open');\n\n if (transition) {\n el.classList.add('is-closing');\n } else {\n el.classList.remove('is-closing');\n el.open = false;\n\n removeTrapFocus(this.opener);\n this.opener = null;\n }\n\n setTimeout(() => {\n const offsetMenu = el.querySelector('.main-nav__child--offset-right');\n if (offsetMenu) offsetMenu.classList.remove('main-nav__child--offset-right');\n }, 200);\n\n if (theme.mediaMatches.md || el.classList.contains('main-menu__disclosure')) {\n document.body.classList.remove('overflow-hidden');\n }\n }\n\n /**\n * Decide whether to show a particular mega menu\n * @param {object} evt - Event object\n */\n handleBlockSelect(evt) {\n if (this.nav) {\n const activeDisclosure = this.nav.querySelector('details.is-open');\n if (activeDisclosure) {\n this.close(activeDisclosure, false);\n }\n }\n\n if (evt.target.matches('.js-mega-nav')) {\n MainMenu.open(evt.target, false);\n this.toggleOverlay(true);\n }\n }\n\n /**\n * Decide whether to hide a particular mega menu\n * @param {object} evt - Event object\n */\n handleBlockDeselect(evt) {\n if (evt.target.matches('.js-mega-nav')) {\n this.close(evt.target, false);\n this.toggleOverlay(false);\n }\n }\n }\n\n customElements.define('main-menu', MainMenu);\n}\n","/**\n * Adds an observer to initialise a script when an element is scrolled into view.\n * @param {Element} element - Element to observe.\n * @param {Function} callback - Function to call when element is scrolled into view.\n * @param {number} [threshold=500] - Distance from viewport (in pixels) to trigger init.\n */\nif (!window.initLazyScript) {\n window.initLazyScript = function(element, callback, threshold = 500) {\n if ('IntersectionObserver' in window) {\n const io = new IntersectionObserver((entries, observer) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting) {\n if (typeof callback === 'function') {\n callback();\n observer.unobserve(entry.target);\n }\n }\n });\n }, { rootMargin: `0px 0px ${threshold}px 0px` });\n\n io.observe(element);\n } else {\n callback();\n }\n }\n}\n\nif (!customElements.get('carousel-slider')) {\n class CarouselSlider extends HTMLElement {\n constructor() {\n super();\n this.slides = this.querySelectorAll('.slider__item');\n if (this.slides.length < 2) return;\n window.initLazyScript(this, this.init.bind(this));\n }\n\n disconnectedCallback() {\n window.removeEventListener('on:breakpoint-change', this.breakpointChangeHandler);\n }\n\n init() {\n this.slider = this.querySelector('.slider');\n this.grid = this.querySelector('.slider__grid');\n this.nav = this.querySelector('.slider-nav');\n this.rtl = document.dir === 'rtl';\n this.breakpointChangeHandler = this.breakpointChangeHandler\n || this.handleBreakpointChange.bind(this);\n\n if (this.nav) {\n this.prevBtn = this.querySelector('button[name=\"prev\"]');\n this.nextBtn = this.querySelector('button[name=\"next\"]');\n }\n\n this.initSlider();\n window.addEventListener('on:breakpoint-change', this.breakpointChangeHandler);\n }\n\n initSlider() {\n if (!this.getAttribute('disable-mobile') && !this.getAttribute('disable-desktop')) {\n this.gridWidth = this.grid.clientWidth;\n\n // Distance between leading edges of adjacent slides (i.e. width of card + gap).\n this.slideSpan = this.getWindowOffset(this.slides[1]) - this.getWindowOffset(this.slides[0]);\n\n // Width of gap between slides.\n this.slideGap = this.slideSpan - this.slides[0].clientWidth;\n\n this.slidesPerPage = Math.round((this.gridWidth + this.slideGap) / this.slideSpan);\n this.slidesToScroll = 1;\n this.totalPages = this.slides.length - this.slidesPerPage + 1;\n\n this.setCarouselState(this.totalPages > 1);\n if (this.totalPages < 2) return;\n\n this.sliderStart = this.getWindowOffset(this.slider);\n if (!this.sliderStart) this.sliderStart = (this.slider.clientWidth - this.gridWidth) / 2;\n this.sliderEnd = this.sliderStart + this.gridWidth;\n\n // if (window.matchMedia('(pointer: fine)').matches) {\n // this.slider.classList.add('is-grabbable');\n // }\n\n this.addListeners();\n this.setButtonStates();\n } else {\n this.setAttribute('inactive', '');\n }\n }\n\n addListeners() {\n if (this.nav) {\n this.scrollHandler = window.debounce(this.handleScroll.bind(this));\n this.navClickHandler = this.handleNavClick.bind(this);\n\n this.slider.addEventListener('scroll', this.scrollHandler);\n this.nav.addEventListener('click', this.navClickHandler);\n }\n\n if (window.matchMedia('(pointer: fine)').matches) {\n this.mousedownHandler = this.handleMousedown.bind(this);\n this.mouseupHandler = this.handleMouseup.bind(this);\n this.mousemoveHandler = this.handleMousemove.bind(this);\n\n this.slider.addEventListener('mousedown', this.mousedownHandler);\n this.slider.addEventListener('mouseup', this.mouseupHandler);\n this.slider.addEventListener('mouseleave', this.mouseupHandler);\n this.slider.addEventListener('mousemove', this.mousemoveHandler);\n }\n }\n\n removeListeners() {\n if (this.nav) {\n this.slider.removeEventListener('scroll', this.scrollHandler);\n this.nav.removeEventListener('click', this.navClickHandler);\n }\n\n this.slider.removeEventListener('mousedown', this.mousedownHandler);\n this.slider.removeEventListener('mouseup', this.mouseupHandler);\n this.slider.removeEventListener('mouseleave', this.mouseupHandler);\n this.slider.removeEventListener('mousemove', this.mousemoveHandler);\n }\n\n /**\n * Handles 'scroll' events on the slider element.\n */\n handleScroll() {\n this.currentIndex = Math.round(this.slider.scrollLeft / this.slideSpan);\n this.setButtonStates();\n }\n\n /**\n * Handles 'mousedown' events on the slider element.\n * @param {object} evt - Event object.\n */\n handleMousedown(evt) {\n this.mousedown = true;\n this.startX = evt.pageX - this.sliderStart;\n this.scrollPos = this.slider.scrollLeft;\n this.slider.classList.add('is-grabbing');\n }\n\n /**\n * Handles 'mouseup' events on the slider element.\n */\n handleMouseup() {\n this.mousedown = false;\n this.slider.classList.remove('is-grabbing');\n }\n\n /**\n * Handles 'mousemove' events on the slider element.\n * @param {object} evt - Event object.\n */\n handleMousemove(evt) {\n if (!this.mousedown) return;\n evt.preventDefault();\n\n const x = evt.pageX - this.sliderStart;\n this.slider.scrollLeft = this.scrollPos - (x - this.startX) * 2;\n }\n\n /**\n * Handles 'click' events on the nav buttons container.\n * @param {object} evt - Event object.\n */\n handleNavClick(evt) {\n if (!evt.target.matches('.slider-nav__btn')) return;\n\n if ((evt.target.name === 'next' && !this.rtl) || (evt.target.name === 'prev' && this.rtl)) {\n this.scrollPos = this.slider.scrollLeft + this.slidesToScroll * this.slideSpan;\n } else {\n this.scrollPos = this.slider.scrollLeft - this.slidesToScroll * this.slideSpan;\n }\n\n this.slider.scrollTo({ left: this.scrollPos, behavior: 'smooth' });\n }\n\n /**\n * Handles 'on:breakpoint-change' events on the window.\n */\n handleBreakpointChange() {\n this.removeListeners();\n this.initSlider();\n }\n\n /**\n * Gets the offset of an element from the edge of the viewport (left for ltr, right for rtl).\n * @param {number} el - Element.\n * @returns {number}\n */\n getWindowOffset(el) {\n return this.rtl\n ? window.innerWidth - el.getBoundingClientRect().right\n : el.getBoundingClientRect().left;\n }\n\n /**\n * Gets the visible state of a slide.\n * @param {Element} el - Slide element.\n * @returns {boolean}\n */\n getSlideVisibility(el) {\n const slideStart = this.getWindowOffset(el);\n const slideEnd = Math.floor(slideStart + this.slides[0].clientWidth);\n return slideStart >= this.sliderStart && slideEnd <= this.sliderEnd;\n }\n\n /**\n * Sets the active state of the carousel.\n * @param {boolean} active - Set carousel as active.\n */\n setCarouselState(active) {\n if (active) {\n this.removeAttribute('inactive');\n\n // If slider width changed when activated, reinitialise it.\n if (this.gridWidth !== this.grid.clientWidth) {\n this.handleBreakpointChange();\n }\n } else {\n this.setAttribute('inactive', '');\n }\n }\n\n /**\n * Sets the disabled state of the nav buttons.\n */\n setButtonStates() {\n if (!this.prevBtn && !this.nextBtn) {\n return;\n }\n\n this.prevBtn.disabled = this.getSlideVisibility(this.slides[0]) && this.slider.scrollLeft === 0;\n this.nextBtn.disabled = this.getSlideVisibility(this.slides[this.slides.length - 1]);\n }\n }\n\n customElements.define('carousel-slider', CarouselSlider);\n}","/* global debounce */\n\nif (!customElements.get('predictive-search')) {\n class PredictiveSearch extends HTMLElement {\n constructor() {\n super();\n this.cachedResults = {};\n this.input = this.querySelector('.js-search-input');\n this.productTypeSelect = this.querySelector('.js-search-product-types');\n this.productTypeInput = document.getElementById('product_type_input');\n this.resetBtn = this.querySelector('.js-search-reset');\n this.results = this.querySelector('.js-search-results');\n this.overlay = this.querySelector('.js-search-overlay');\n this.statusEl = this.querySelector('.js-search-status');\n this.loadingText = this.getAttribute('data-loading-text');\n this.addListeners();\n }\n\n /**\n * Triggers when the web component is removed from the DOM\n */\n disconnectedCallback() {\n this.close();\n }\n\n addListeners() {\n this.input.addEventListener('focus', this.handleFocus.bind(this));\n this.input.addEventListener('input', window.debounce(this.handleInput.bind(this)));\n if (this.productTypeSelect) {\n this.productTypeSelect.addEventListener('change', this.handleProductTypeChange.bind(this));\n }\n this.querySelector('.search').addEventListener('submit', this.handleSubmit.bind(this));\n }\n\n /**\n * Gets the value of the search input field.\n * @returns {string}\n */\n getQuery() {\n return this.input.value.trim();\n }\n\n /**\n * Handles search form submit.\n * @param {object} evt - Event object.\n */\n handleSubmit(evt) {\n if (\n !this.getQuery().length\n || this.querySelector('.predictive-search__item[aria-selected=\"true\"]:not(.js-submit)')\n ) {\n evt.preventDefault();\n }\n }\n\n /**\n * Handles 'input' events on the search field.\n */\n handleInput() {\n // autocomplete=off prevents browser from restoring value after using back button in Safari\n this.input.setAttribute('value', this.input.value);\n\n const searchTerm = this.getQuery();\n\n if (!searchTerm.length) {\n this.close();\n return;\n }\n\n if (searchTerm.length >= 3) {\n this.getResults(searchTerm);\n }\n }\n\n /**\n * Handles a change of product type\n * @param {object} evt - Event object.\n */\n handleProductTypeChange(evt) {\n this.productTypeInput.value = evt.detail.selectedValue;\n const query = this.getQuery();\n if (query.length > 0) {\n this.getResults(query);\n }\n }\n\n /**\n * Handles 'focus' events on the search field.\n */\n handleFocus() {\n const searchTerm = this.getQuery();\n if (!searchTerm.length) return;\n\n if (this.getAttribute('results') === 'true') {\n this.open();\n } else {\n this.getResults(searchTerm);\n }\n }\n\n /**\n * Handles 'keydown' events on the custom element.\n * @param {object} evt - Event object.\n */\n handleKeydown(evt) {\n // Let tabs script handle keydown events on the tab buttons.\n if (evt.target.matches('.tablist__tab')) return;\n\n switch (evt.key) {\n case 'ArrowUp':\n case 'ArrowDown':\n evt.preventDefault();\n\n if (this.hasAttribute('open')) {\n this.handleResultsNav(evt.key);\n }\n break;\n\n case 'Enter':\n this.selectOption();\n break;\n\n case 'Escape':\n this.close();\n break;\n\n // no default\n }\n }\n\n /**\n * Handles 'keyup' events on the custom element.\n */\n handleKeyup() {\n // If search field is empty after key press, close the results.\n if (!this.getQuery().length) this.close();\n }\n\n /**\n * Handles keyboard navigation of the results.\n * @param {string} key - Key pressed.\n */\n handleResultsNav(key) {\n const selectedResult = this.querySelector(\n '[role=\"tabpanel\"]:not([hidden]) [aria-selected=\"true\"]'\n );\n const allResults = this.querySelectorAll(\n '[role=\"tabpanel\"]:not([hidden]) .predictive-search__item'\n );\n let resultToSelect = allResults[0];\n\n if (key === 'ArrowUp') {\n if (!selectedResult) return;\n\n // Select the next result up or the last one if we've reached the top of the list.\n resultToSelect = selectedResult.previousElementSibling || allResults[allResults.length - 1];\n } else if (key === 'ArrowDown') {\n if (selectedResult) {\n // Select the next result down or the first one if we've reached the bottom of the list.\n resultToSelect = selectedResult.nextElementSibling || allResults[0];\n }\n }\n\n this.statusEl.textContent = '';\n\n if (resultToSelect) {\n // If the selected item didn't change, do nothing.\n if (resultToSelect === selectedResult) return;\n\n resultToSelect.setAttribute('aria-selected', 'true');\n if (selectedResult) selectedResult.setAttribute('aria-selected', 'false');\n\n this.setLiveRegionText(resultToSelect.textContent);\n this.input.setAttribute('aria-activedescendant', resultToSelect.id);\n }\n }\n\n /**\n * Selects a result\n */\n selectOption() {\n const selectedResult = this.querySelector('[aria-selected=\"true\"] > .js-search-link');\n if (selectedResult) selectedResult.click();\n }\n\n /**\n * Gets the results for a search term.\n * @param {string} searchTerm - Search query.\n */\n async getResults(searchTerm) {\n this.setLiveRegionLoadingState();\n\n // const searchTypes = [];\n // if (theme.settings.pSearchShowProducts) searchTypes.push('product');\n // if (theme.settings.pSearchShowCollections) searchTypes.push('collection');\n // if (theme.settings.pSearchShowPages) searchTypes.push('page');\n // if (theme.settings.pSearchShowArticles) searchTypes.push('article');\n // if (theme.settings.pSearchShowSuggestions) searchTypes.push('query');\n\n // let searchFields = 'title,product_type,variants.title,vendor';\n // if (theme.settings.pSearchIncludeSkus) searchFields += ',variants.sku';\n // if (theme.settings.pSearchIncludeTags) searchFields += ',tag';\n\n // let searchParams = '';\n // if (this.productTypeInput && this.productTypeInput.value !== '') {\n // searchParams = `q=product_type:${encodeURIComponent(this.productTypeInput.value)} AND ${encodeURIComponent(searchTerm)}`;\n // } else {\n // searchParams = `q=${encodeURIComponent(searchTerm)}`;\n // }\n\n // searchParams += `&${encodeURIComponent('resources[type]')}=${searchTypes.join()}`;\n // searchParams += `&${encodeURIComponent('resources[limit]')}=${theme.settings.pSearchLimit}`;\n // searchParams += `&${encodeURIComponent('resources[limit_scope]')}=${\n // theme.settings.pSearchLimitScope\n // }`;\n // searchParams += `&${encodeURIComponent('resources[options][fields]')}=${searchFields}`;\n // searchParams += '§ion_id=predictive-search';\n\n let searchParams = `keywords=${encodeURIComponent(searchTerm)}`;\n\n const queryKey = searchParams.replace(' ', '-').toLowerCase();\n if (this.cachedResults[queryKey]) {\n this.renderResults(this.cachedResults[queryKey]);\n return;\n }\n\n try {\n const response = await fetch(`${theme.routes.predictiveSearch}?${searchParams}`);\n\n if (!response.ok) throw new Error(response.status);\n\n // const tmpl = document.createElement('template');\n // tmpl.innerHTML = await response.text();\n\n // const resultsEl = tmpl.content.querySelector('#shopify-section-predictive-search');\n // const resultsMarkup = resultsEl.innerHTML.replace(/psearch/g, this.input.id);\n\n const resultsMarkup = await response.text();\n\n this.cachedResults[queryKey] = resultsMarkup;\n this.renderResults(resultsMarkup);\n } catch (error) {\n this.close();\n throw error;\n }\n }\n\n /**\n * Sets the live region loading state.\n */\n setLiveRegionLoadingState() {\n this.setLiveRegionText(this.loadingText);\n }\n\n /**\n * Sets the live region text.\n * @param {string} statusText - Status text.\n */\n setLiveRegionText(statusText) {\n this.statusEl.setAttribute('aria-hidden', 'false');\n this.statusEl.textContent = statusText;\n\n setTimeout(() => {\n this.statusEl.setAttribute('aria-hidden', 'true');\n }, 1000);\n }\n\n /**\n * Renders the results markup.\n * @param {string} resultsMarkup - Results markup.\n */\n renderResults(resultsMarkup) {\n this.results.innerHTML = resultsMarkup;\n this.setAttribute('results', true);\n this.open();\n }\n\n /**\n * Opens the results listbox.\n */\n open() {\n this.overlay.classList.add('is-visible');\n if (this.getQuery().length) this.resetBtn.hidden = false;\n this.input.setAttribute('aria-expanded', 'true');\n this.setAttribute('open', '');\n document.body.classList.add('overlay-predictive-search');\n\n // Add event handlers (so the bound event listeners can be removed).\n this.keydownHandler = this.keydownHandler || this.handleKeydown.bind(this);\n this.keyupHandler = this.keyupHandler || this.handleKeyup.bind(this);\n this.resetBtnClickHandler = this.resetBtnClickHandler || this.close.bind(this);\n this.overlayClickHandler = this.overlayClickHandler || this.close.bind(this);\n\n // Add event listeners (for while results are open).\n this.addEventListener('keydown', this.keydownHandler);\n this.addEventListener('keyup', this.keyupHandler);\n this.resetBtn.addEventListener('click', this.resetBtnClickHandler);\n this.overlay.addEventListener('click', this.overlayClickHandler);\n }\n\n /**\n * Closes the results listbox.\n * @param {object} evt - Event object.\n */\n close(evt) {\n // If reset button was clicked, empty the input field.\n if (evt && evt.target === this.resetBtn) {\n this.input.value = '';\n this.removeAttribute('results');\n this.input.focus();\n }\n\n // Deselect the selected result (if there is one).\n const selected = this.querySelector('.predictive-search__item[aria-selected=\"true\"]');\n if (selected) selected.setAttribute('aria-selected', 'false');\n\n this.removeAttribute('open');\n this.resetBtn.hidden = true;\n this.overlay.classList.remove('is-visible');\n this.input.setAttribute('aria-activedescendant', '');\n this.input.setAttribute('aria-expanded', 'false');\n document.body.classList.remove('overlay-predictive-search');\n\n // Remove event listeners added on search results opening.\n this.removeEventListener('keydown', this.keydownHandler);\n this.resetBtn.removeEventListener('click', this.resetBtnClickHandler);\n this.overlay.removeEventListener('click', this.overlayClickHandler);\n }\n }\n\n customElements.define('predictive-search', PredictiveSearch);\n}","/* global debounce */\n\nif (!customElements.get('search-form')) {\n class SearchForm extends HTMLElement {\n constructor() {\n super();\n this.input = this.querySelector('.js-search-input');\n this.productTypeSelect = this.querySelector('.js-search-product-types');\n this.productTypeInput = document.getElementById('product_type_input');\n this.resetBtn = this.querySelector('.js-search-reset');\n this.addListeners();\n this.init();\n }\n\n addListeners() {\n this.input.addEventListener('input', window.debounce(this.handleInput.bind(this)));\n if (this.productTypeSelect) {\n this.productTypeSelect.addEventListener('change', this.handleProductTypeChange.bind(this));\n }\n this.resetBtn.addEventListener('click', this.handleReset.bind(this));\n }\n\n init() {\n if ((this.input.dataset.placeholderTwo || this.input.dataset.placeholderThree)\n && (this.input.dataset.placeholderPromptsMob === 'true' || theme.mediaMatches.md)) {\n this.typeInPlaceholders();\n }\n }\n\n /**\n * Simulates the placeholder titles being typed in and the previous one deleted, on repeat\n */\n typeInPlaceholders() {\n const typingSpeed = this.input.dataset.typingSpeed || 100;\n const deletingSpeed = this.input.dataset.deletingSpeed || 60;\n const delayAfterDeleting = this.input.dataset.delayAfterDeleting || 500;\n const delayBeforeFirstDelete = this.input.dataset.delayBeforeFirstDelete || 2000;\n const delayAfterWordTyped = this.input.dataset.delayAfterWordTyped || 2400;\n const placeholders = [];\n\n if (this.input.placeholder) {\n placeholders.push(this.input.placeholder);\n }\n\n if (this.input.dataset.placeholderTwo) {\n placeholders.push(this.input.dataset.placeholderTwo);\n }\n\n if (this.input.dataset.placeholderThree) {\n placeholders.push(this.input.dataset.placeholderThree);\n }\n\n const typeInNextPlaceholder = async (placeholder) => {\n await new Promise((resolve) => {\n let currentPlaceholder = this.input.getAttribute('placeholder');\n\n // If necessary remove the start of the word to type in if it already exists in the\n // placeholder\n let nextPlaceholder = (currentPlaceholder.length >= 3\n && placeholder.startsWith(currentPlaceholder))\n ? placeholder.replace(currentPlaceholder, '')\n : placeholder;\n\n const typingIntervalId = setInterval(() => {\n currentPlaceholder = this.input.getAttribute('placeholder');\n this.input.setAttribute('placeholder', currentPlaceholder + nextPlaceholder.charAt(0));\n if (nextPlaceholder.length === 1) {\n resolve();\n clearInterval(typingIntervalId); // Stop typing\n } else {\n nextPlaceholder = nextPlaceholder.substring(1);\n }\n }, typingSpeed);\n });\n };\n\n const deleteCurrentPlaceholder = async (nextPlaceholder) => {\n await new Promise((resolve) => {\n let prevPlaceholder = this.input.getAttribute('placeholder');\n const deletionIntervalId = setInterval(() => {\n const newPlaceholder = prevPlaceholder.substring(0, prevPlaceholder.length - 1);\n this.input.setAttribute('placeholder', newPlaceholder);\n prevPlaceholder = newPlaceholder;\n if (prevPlaceholder.length === 0\n || (prevPlaceholder.length >= 3 && nextPlaceholder.startsWith(prevPlaceholder))) {\n resolve();\n clearInterval(deletionIntervalId);\n }\n }, deletingSpeed);\n });\n };\n\n let startIndex = 0;\n const showNextPlaceholder = () => {\n startIndex = (startIndex + 1) % placeholders.length;\n const nextPlaceholder = placeholders[startIndex];\n deleteCurrentPlaceholder.call(this, nextPlaceholder).then(() => {\n setTimeout(() => {\n typeInNextPlaceholder.call(this, nextPlaceholder).then(() => {\n setTimeout(showNextPlaceholder.bind(this), delayAfterWordTyped);\n });\n }, delayAfterDeleting);\n });\n };\n\n setTimeout(showNextPlaceholder.bind(this), delayBeforeFirstDelete);\n }\n\n /**\n * Handles 'input' events on the search field.\n */\n handleInput() {\n if (this.input.value.length > 0) {\n this.input.classList.add('search__input--dirty');\n } else {\n this.input.classList.remove('search__input--dirty');\n }\n }\n\n /**\n * Handles a change of product type\n * @param {object} evt - Event object.\n */\n handleProductTypeChange(evt) {\n this.productTypeInput.value = evt.detail.selectedValue;\n }\n\n /**\n * Handles the reset button being clicked\n */\n handleReset() {\n this.input.classList.remove('search__input--dirty');\n }\n }\n\n customElements.define('search-form', SearchForm);\n}\n"],"names":["mediaQueries","mqKeys","mqLists","handleMqChange","newMatches","acc","media","key","mq","fn","wait","t","args","header","height","announcement","setDimensionVariables","StoreHeader","ccHeader","pageCount","shakeFrequency","evt","searchBar","headerGroupHeight","section","headerEnd","trapFocusHandlers","removeTrapFocus","elementToFocus","trapFocus","container","focusableEls","firstEl","lastEl","MainMenu","activeDisclosure","childToggle","menuLink","singleLink","elem","sidebarLink","childNavLink","summaryElem","lastSidenavElem","menu","openDisclosure","navElem","activeChildNav","navid","childMenu","childPromo","menuElem","disclosure","mainMenuContent","el","show","mainMenuOpen","dropdownContainer","dropdown","grandchildElem","firstSummaryElem","transition","offsetMenu","element","callback","threshold","entries","observer","entry","CarouselSlider","x","slideStart","slideEnd","active","PredictiveSearch","searchTerm","query","selectedResult","allResults","resultToSelect","searchParams","queryKey","response","resultsMarkup","error","statusText","selected","SearchForm","typingSpeed","deletingSpeed","delayAfterDeleting","delayBeforeFirstDelete","delayAfterWordTyped","placeholders","typeInNextPlaceholder","placeholder","resolve","currentPlaceholder","nextPlaceholder","typingIntervalId","deleteCurrentPlaceholder","prevPlaceholder","deletionIntervalId","newPlaceholder","startIndex","showNextPlaceholder"],"mappings":"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"}