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