/** * @license * Copyright 2019 Google LLC * SPDX-License-Identifier: BSD-3-Clause */ import {LitElement, html, css} from 'lit'; import {customElement, property, query} from 'lit/decorators.js'; @customElement('iu-card') export class Card extends LitElement { @query('.img') cardImg; @query('.content') cardContent; static override styles = css` :host{ display: block; } .card{ display: block; text-decoration: none; color: var(--iu-color-black); position: relative; aspect-ratio: 1/1; overflow: hidden; } .card:hover .img{ height: 100% !important; } .img{ transition: height .2s ease; position: absolute; top: 0px; left: 0px; width: 100%; overflow: hidden; background-image: linear-gradient(to top, var(--iu-color-grey-400), var(--iu-color-grey-200)); } .img img{ width: 100%; height: 100%; object-fit: cover; } .header{ padding-top: 0.75rem; padding-bottom: 0.75rem; display: flex; justify-content: space-between; font: var(--iu-f-0); color: var(--iu-color-grey-300); } .content p{ font: var(--iu-f-2); font-weight: bold; margin-top: 0; } `; setCardHeight = () => { requestAnimationFrame(() => { const cardHeight = this.clientHeight const cardTextHeight = this.cardContent.clientHeight const imgHeight = cardHeight-cardTextHeight this.cardImg.style.height = `${imgHeight}px` this.cardContent.style.marginTop = `${imgHeight}px` }) } override firstUpdated() { super.firstUpdated(); const imgElement = this.cardImg.querySelector('img'); if (imgElement) { imgElement.addEventListener('load', this.setCardHeight); } this.setCardHeight() // Observe resizing const resizeObserver = new ResizeObserver(() => this.setCardHeight()); resizeObserver.observe(this); } @property() href : string = ''; @property() category : string = 'Categoria'; @property() date : string = '01.01.2024'; @property() name : string = 'Default'; @property() img? : string = ''; override render() { return html` <a href="${this.href}" class="card"> <div class="img"> ${this.img && html`<img src="${this.img}">`} </div> <div class="content"> <div class="header"> <span class="category">${this.category}</span> <span class="date">${this.date}</span> </div> <p>${this.name}</p> </div> </a> `; } } declare global { interface HTMLElementTagNameMap { 'iu-card': Card; } }