Newer
Older
iuav-ui / src / components / floating-logo / floating-logo.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-floating-logo')

export class FloatingLogo extends LitElement {
  static override styles = css`
    :host{
      transition: all .2s ease;
      transform: translateY(0) translateX(-2px);
      position: fixed;
      bottom: 2.5rem;
      left: 2.5rem;
      z-index: 20;
      display: none;
      mix-blend-mode: difference;
    }
    @media ${unsafeCSS(breakpoints.md)} {
      :host{
        display: block;
      }
    }
    :host(.is-visible){
      transform: translateY(0) translateX(-50%);
      left: 0;
    }
    a svg{
      width: 40px;
      display: block;
    }
  `;

  currentScrollPos: Number = 0;
  prevScrollPos: Number = 0;

  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 scrolling down, hide header and position logo to the left
    // if scrolling up, show header and logo in initial position
    if (this.prevScrollPos > 0 && this.prevScrollPos < this.currentScrollPos) {
      this.classList.add('is-visible')
    } else if (this.prevScrollPos >= this.currentScrollPos) {
        this.classList.remove('is-visible')
    }
  
    this.prevScrollPos = this.currentScrollPos

  }

  override render() {
    return html`
      <a href="">
        <svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 50 175"><path d="M18.734 20.694V18.19h5.033V2.505h-5.033V0h13.477v2.505h-5.033V18.19h5.033v2.504H18.734ZM10.752 34.531H.976v3.08h9.774v-3.08ZM30.337 34.531h-9.774v3.08h9.774v-3.08ZM49.973 34.531h-9.817v3.08h9.817v-3.08ZM25.479 72.43c-4.825 0-6.448-1.767-6.448-6.324V51.447h3.411v15.11c0 2.464 1.123 3.203 3.037 3.203 1.747 0 3.036-.657 3.036-3.203v-15.11h3.41v14.659c0 4.393-1.996 6.323-6.405 6.323h-.041ZM10.752 85.98H.976v3.081h9.774v-3.08ZM30.337 85.98h-9.774v3.081h9.774v-3.08ZM49.973 85.98h-9.817v3.081h9.817v-3.08ZM30.046 123.55l-1.04-4.311h-7.071l-1.04 4.311h-3.66l5.99-20.654h4.491l5.99 20.654h-3.66Zm-4.576-18.765-2.87 11.702h5.74l-2.87-11.702ZM10.752 137.388H.976v3.08h9.774v-3.08ZM30.337 137.388h-9.774v3.08h9.774v-3.08ZM49.973 137.388h-9.817v3.08h9.817v-3.08ZM27.57 175H23.37l-6.572-20.694h3.868l4.825 18.518 4.825-18.518h3.827L27.57 175Z" fill="#fff"></path></svg>
      </a>
    `;
  }

}

declare global {
  interface HTMLElementTagNameMap {
    'iu-floating-logo': FloatingLogo;
  }
}