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

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

@customElement('iu-hero-banner')

export class HeroBanner extends LitElement {
  static override styles = css`
    :host{
        display:block;
        margin-bottom: var(--iu-spacing-block-lg);
    }
    .video{
      aspect-ratio: 16/9;
      position: relative;
      overflow: hidden;
      margin-bottom: calc(var(--iu-grid-gutter)*2);
      z-index: 20;
    }
    @media ${unsafeCSS(breakpoints.md)} {
      .video{
        aspect-ratio: auto;
      }
    }
    @media ${unsafeCSS(breakpoints.lg)} {
      .video{
        height: calc(var(--iu-hero-banner-height) - var(--iu-grid-gutter));
      }
    }
    .video video{
      width: 100%;
      height: 100%;
      object-fit: cover;
    }
    h1{
      font-weight: 400;
      font: var(--iu-f-4);
      z-index: 10;
      margin-bottom: 0;
      margin-top: 0;
      width: calc(100% / 12 * 11);
    }
    @media ${unsafeCSS(breakpoints.md)} {
      h1{
        font: var(--iu-f-7);
      }
    }
    @media ${unsafeCSS(breakpoints.lg)} {
      h1{
        font: var(--iu-f-9);
        position: sticky;
        bottom: var(--iu-grid-gutter);
      }
    }
  `;

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

  setHeroBannerHeight = () => {
    if (window.matchMedia('(min-width: 62rem)').matches) {
      //get banner top offset
      const bannerOffsetTop = this.offsetTop
      //set banner height
      this.style.setProperty('--iu-hero-banner-height', `${window.innerHeight-bannerOffsetTop}px`)
    }
  }

  @property() jpg? = '';
  @property() webp? = '';
  @property() alt? = '';
  @property() mp4? = '';
  @property() webm? = '';
  @property() heading? = '';

  override firstUpdated(){
    requestAnimationFrame(() => {
      this.setHeroBannerHeight()
    });
  }

  override render() {
    return html`
        <div>
            <iu-container>

              ${this.jpg && html`
                <div class="img">
                  <picture>
                    ${this.webp ? html`<source srcset="${this.webp}" type="image/webp">` : ''}
                    <source srcset="${this.jpg}" type="image/jpg">
                    <img src="${this.jpg}" alt="${this.alt}">
                  </picture>
                </div>
              `}

              ${(this.webm || this.mp4) && html`
                <div class="video">
                  <video width="1920" height="1080" autoplay muted loop>
                    ${this.webm ? html`<source src="${this.webm}" type="video/webm">` : ''}
                    ${this.mp4 ? html`<source src="${this.mp4}" type="video/mp4">` : ''}
                    Your browser does not support the video tag.
                  </video>
                </div>
              `}

              ${this.heading && html`
                <h1>${this.heading}</h1>
              `}
  
            </iu-container>
        </div>  
    `;
  }

}

declare global {
  interface HTMLElementTagNameMap {
    'iu-hero-banner': HeroBanner;
  }
}