class StickyHeader extends HTMLElement { constructor() { super(); } connectedCallback() { this.header = this.closest('#shopify-section-header'); this.predictiveSearch = this.querySelector('predictive-search'); this.enableStickyHeader = [true, 'true'].includes(this.dataset.enableStickyHeader); this.announcementBar = document.querySelector('announcement-bar'); this.isTransparent = this.hasAttribute('data-transparent'); this.dropdownLinks = this.querySelectorAll('[data-expand-on-hover]'); this.overlay = this.querySelector('[data-overlay]'); this.headerOffset = document.querySelector('#shopify-section-announcement-bar')?.offsetHeight || 0; this.setHeaderOffset(); this.onScrollHandler = this.onScroll.bind(this); window.addEventListener('scroll', this.onScrollHandler, false); window.addEventListener('resize', this.setHeaderOffset.bind(this)); this.dropdownLinks.forEach((link) => { link.addEventListener('mouseenter', (event) => this.dropdownOverlayToggle(event)); link.addEventListener('mouseleave', (event) => this.dropdownOverlayToggle(event)); }) } disconnectedCallback() { window.removeEventListener('scroll', this.onScrollHandler); } setHeaderOffset() { if (!this.isTransparent) { return; } let offset = 0; const headerInner = this.header.querySelector('.header__inner'); const headerInnerHeight = headerInner.clientHeight || 0; const isAnnouncementBelow = this.announcementBar?.classList.contains('announcement-bar--is-bellow') || false; offset += headerInnerHeight; if (isAnnouncementBelow && this.announcementBar) { offset += this.announcementBar.clientHeight; this.announcementBar.style.top = `${offset}px`; } this.header.style.marginBottom = `-${offset}px`; } onScroll() { if (!this.enableStickyHeader || (window.outerWidth < 1000)) { return; } const scrollTop = window.pageYOffset || document.documentElement.scrollTop; if (this.predictiveSearch && this.predictiveSearch.isOpen) return; let isScrolledAfter = scrollTop > this.headerOffset; const isAnnouncementBelow = this.announcementBar?.classList.contains('announcement-bar--is-bellow') || false; isAnnouncementBelow ? isScrolledAfter = scrollTop > 0 : isScrolledAfter = scrollTop > this.headerOffset; if (isScrolledAfter) { requestAnimationFrame(this.reveal.bind(this)); } else { requestAnimationFrame(this.reset.bind(this)); } this.classList.toggle('is-solid', isScrolledAfter && this.isTransparent); } reveal() { this.header.classList.add('shopify-section-header-sticky', 'animate'); this.header.classList.remove('shopify-section-header-hidden'); } reset() { this.header.classList.remove('shopify-section-header-hidden', 'shopify-section-header-sticky', 'animate'); } closeMenuDisclosure() { this.disclosures = this.disclosures || this.header.querySelectorAll('details-disclosure'); this.disclosures.forEach(disclosure => disclosure.close()); } closeSearchModal() { this.searchModal = this.searchModal || this.header.querySelector('details-modal'); if (!this.searchModal) { return; } this.searchModal.close(false); } dropdownOverlayToggle(event) { if (!this.overlay) { return; } this.overlay.classList.toggle('is-visible', event.type === 'mouseenter'); } } customElements.define('sticky-header', StickyHeader);