Newer
Older
iuav-ui / src / components / card / card.ts
/**
 * @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;
  }
}