1var _____WB$wombat$assign$function_____=function(name){return (self._wb_wombat && self._wb_wombat.local_init && self._wb_wombat.local_init(name))||self[name];};if(!self.__WB_pmw){self.__WB_pmw=function(obj){this.__WB_source=obj;return this;}}{ 2let window = _____WB$wombat$assign$function_____("window"); 3let self = _____WB$wombat$assign$function_____("self"); 4let document = _____WB$wombat$assign$function_____("document"); 5let location = _____WB$wombat$assign$function_____("location"); 6let top = _____WB$wombat$assign$function_____("top"); 7let parent = _____WB$wombat$assign$function_____("parent"); 8let frames = _____WB$wombat$assign$function_____("frames"); 9let opens = _____WB$wombat$assign$function_____("opens"); 10(function() { 11 var __sections__ = {}; 12 (function() { 13 for(var i = 0, s = document.getElementById('sections-script').getAttribute('data-sections').split(','); i < s.length; i++) 14 __sections__[s[i]] = true; 15 })(); 16 (function() { 17 if (!__sections__["footer"]) return; 18 try { 19 20 class LocalizationForm extends HTMLElement { 21 constructor() { 22 super(); 23 this.elements = { 24 input: this.querySelector('input[name="locale_code"], input[name="country_code"]'), 25 button: this.querySelector('button'), 26 panel: this.querySelector('.disclosure__list-wrapper'), 27 }; 28 this.elements.button.addEventListener('click', this.openSelector.bind(this)); 29 this.elements.button.addEventListener('focusout', this.closeSelector.bind(this)); 30 this.addEventListener('keyup', this.onContainerKeyUp.bind(this)); 31 32 this.querySelectorAll('a').forEach(item => item.addEventListener('click', this.onItemClick.bind(this))); 33 } 34 35 hidePanel() { 36 this.elements.button.setAttribute('aria-expanded', 'false'); 37 this.elements.panel.setAttribute('hidden', true); 38 } 39 40 onContainerKeyUp(event) { 41 if (event.code.toUpperCase() !== 'ESCAPE') return; 42 43 this.hidePanel(); 44 this.elements.button.focus(); 45 } 46 47 onItemClick(event) { 48 event.preventDefault(); 49 const form = this.querySelector('form'); 50 this.elements.input.value = event.currentTarget.dataset.value; 51 if (form) form.submit(); 52 } 53 54 openSelector() { 55 this.elements.button.focus(); 56 this.elements.panel.toggleAttribute('hidden'); 57 this.elements.button.setAttribute('aria-expanded', (this.elements.button.getAttribute('aria-expanded') === 'false').toString()); 58 } 59 60 closeSelector(event) { 61 const shouldClose = event.relatedTarget && event.relatedTarget.nodeName === 'BUTTON'; 62 if (event.relatedTarget === null || shouldClose) { 63 this.hidePanel(); 64 } 65 } 66 } 67 68 customElements.define('localization-form', LocalizationForm); 69 70 } catch(e) { console.error(e); } 71})(); 72 73(function() { 74 if (!__sections__["header"]) return; 75 try { 76 77 class StickyHeader extends HTMLElement { 78 constructor() { 79 super(); 80 } 81 82 connectedCallback() { 83 this.header = document.getElementById('shopify-section-header'); 84 this.headerBounds = {}; 85 this.currentScrollTop = 0; 86 this.preventReveal = false; 87 this.predictiveSearch = this.querySelector('predictive-search'); 88 89 this.onScrollHandler = this.onScroll.bind(this); 90 this.hideHeaderOnScrollUp = () => this.preventReveal = true; 91 92 this.addEventListener('preventHeaderReveal', this.hideHeaderOnScrollUp); 93 window.addEventListener('scroll', this.onScrollHandler, false); 94 95 this.createObserver(); 96 } 97 98 disconnectedCallback() { 99 this.removeEventListener('preventHeaderReveal', this.hideHeaderOnScrollUp); 100 window.removeEventListener('scroll', this.onScrollHandler); 101 } 102 103 createObserver() { 104 let observer = new IntersectionObserver((entries, observer) => { 105 this.headerBounds = entries[0].intersectionRect; 106 observer.disconnect(); 107 }); 108 109 observer.observe(this.header); 110 } 111 112 onScroll() { 113 const scrollTop = window.pageYOffset || document.documentElement.scrollTop; 114 115 if (this.predictiveSearch && this.predictiveSearch.isOpen) return; 116 117 if (scrollTop > this.currentScrollTop && scrollTop > this.headerBounds.bottom) { 118 if (this.preventHide) return; 119 requestAnimationFrame(this.hide.bind(this)); 120 } else if (scrollTop < this.currentScrollTop && scrollTop > this.headerBounds.bottom) { 121 if (!this.preventReveal) { 122 requestAnimationFrame(this.reveal.bind(this)); 123 } else { 124 window.clearTimeout(this.isScrolling); 125 126 this.isScrolling = setTimeout(() => { 127 this.preventReveal = false;
128 }, 66); 129 130 requestAnimationFrame(this.hide.bind(this)); 131 } 132 } else if (scrollTop <= this.headerBounds.top) { 133 requestAnimationFrame(this.reset.bind(this)); 134 } 135 136 this.currentScrollTop = scrollTop; 137 } 138 139 hide() { 140 this.header.classList.add('shopify-section-header-hidden', 'shopify-section-header-sticky'); 141 this.closeMenuDisclosure(); 142 this.closeSearchModal(); 143 } 144 145 reveal() { 146 this.header.classList.add('shopify-section-header-sticky', 'animate'); 147 this.header.classList.remove('shopify-section-header-hidden'); 148 } 149 150 reset() { 151 this.header.classList.remove('shopify-section-header-hidden', 'shopify-section-header-sticky', 'animate'); 152 } 153 154 closeMenuDisclosure() { 155 this.disclosures = this.disclosures || this.header.querySelectorAll('header-menu'); 156 this.disclosures.forEach(disclosure => disclosure.close()); 157 } 158 159 closeSearchModal() { 160 this.searchModal = this.searchModal || this.header.querySelector('details-modal'); 161 this.searchModal.close(false); 162 } 163 } 164 165 customElements.define('sticky-header', StickyHeader); 166 167 } catch(e) { console.error(e); } 168})(); 169 170(function() { 171 if (!__sections__["product-recommendations"]) return; 172 try { 173 174 class ProductRecommendations extends HTMLElement { 175 constructor() { 176 super(); 177 178 const handleIntersection = (entries, observer) => { 179 if (!entries[0].isIntersecting) return; 180 observer.unobserve(this); 181 182 fetch(this.dataset.url) 183 .then(response => response.text()) 184 .then(text => { 185 const html = document.createElement('div'); 186 html.innerHTML = text; 187 const recommendations = html.querySelector('product-recommendations'); 188 189 if (recommendations && recommendations.innerHTML.trim().length) { 190 this.innerHTML = recommendations.innerHTML; 191 } 192 193 if (html.querySelector('.grid__item')) { 194 this.classList.add('product-recommendations--loaded'); 195 } 196 }) 197 .catch(e => { 198 console.error(e); 199 }); 200 } 201 202 new IntersectionObserver(handleIntersection.bind(this), {rootMargin: '0px 0px 200px 0px'}).observe(this); 203 } 204 } 205 206 customElements.define('product-recommendations', ProductRecommendations); 207 208 } catch(e) { console.error(e); } 209})(); 210 211})(); 212 213}
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.