- /**
- * @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;
- }
- }