Newer
Older
iuav-ui / src / components / header / header.ts
/**
 * @license
 * Copyright 2019 Google LLC
 * SPDX-License-Identifier: BSD-3-Clause
 */

import {LitElement, html, css, unsafeCSS} from 'lit';
import {customElement} from 'lit/decorators.js';
import { breakpoints } from '../../breakpoints';

@customElement('iu-header')

export class SiteHeader extends LitElement {
  
  static override styles = css`
    :host{
      position: sticky;
      top: 0;
      z-index: 50;
      background: #fff;
      display:block;
      transform: translateY(0);
      transition: transform .5s ease;
    }
    @media ${unsafeCSS(breakpoints.md)} {
      :host(.is-hidden){
        transform: translateY(-100%);
      }
    }
  `;

  currentScrollPos: Number = 0;
  prevScrollPos: Number = 0;
  headerHeight: Number = 0;
  menuIsOpen: Boolean = false;

  override connectedCallback() {
    super.connectedCallback();
    // Attach the scroll listener to the window
    window.addEventListener('scroll', this.handleScroll);
  }

  override disconnectedCallback() {
    super.disconnectedCallback();
    // Remove the scroll listener to prevent memory leaks
    window.removeEventListener('scroll', this.handleScroll);
  }

  // Scroll handler
  handleScroll = () => {
    
    //set current scroll position to window scroll position
    this.currentScrollPos = window.scrollY

    //if you start scrolling add class to body
    if (this.currentScrollPos > this.headerHeight && this.menuIsOpen == false) {
      document.body.classList.add('is-scrolled')
    } else{
      document.body.classList.remove('is-scrolled')
    }

    // if scrolling down, hide header and position logo to the left
    // if scrolling up, show header and logo in initial position
    if (this.prevScrollPos > this.headerHeight && this.prevScrollPos < this.currentScrollPos && this.menuIsOpen == false) {
      this.classList.add('is-hidden')
      // logo.classList.add('is-visible')
      // overlay.classList.remove('is-active')
    } else if (this.prevScrollPos >= this.currentScrollPos && this.menuIsOpen == false) {
        this.classList.remove('is-hidden')
    }
  
    this.prevScrollPos = this.currentScrollPos

  }

  //set global css var
  getHeaderHeight = () => {
    this.headerHeight = this.clientHeight
    return `${this.clientHeight}px`
  }

  //get header height when first updated
  override firstUpdated(){
    document.documentElement.style.setProperty("--iu-header-height", this.getHeaderHeight())
  }

  override render() {
    return html`
      <header id="site-header" class="site-header">
        <slot></slot>
      </header>
    `;
  }

}

declare global {
  interface HTMLElementTagNameMap {
    'iu-header': SiteHeader;
  }
}