Newer
Older
iuav-ui / src / components / list / list.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-list')

export class List extends LitElement {
  static override styles = css`
  :host{
    display: block;
    margin-bottom: var(--iu-spacing-block);
  }
  :host iu-container{
    display: grid;
    grid-template-columns: repeat( var(--list-columns-sm), 1fr);
    grid-gap: var(--iu-grid-gutter);
  }
  @media ${unsafeCSS(breakpoints.md)} {
    :host iu-container{
      grid-template-columns: repeat( var(--list-columns-md, var(--list-columns-sm)), 1fr);
    }
  }
  @media ${unsafeCSS(breakpoints.lg)} {
    :host iu-container{
      grid-template-columns: repeat( var(--list-columns-lg, var(--list-columns-md, var(--list-columns-sm))), 1fr);
    }
  }
  @media ${unsafeCSS(breakpoints.xl)} {
    :host iu-container{
      grid-template-columns: repeat( var(--list-columns-xl, var(--list-columns-lg, var(--list-columns-md, var(--list-columns-sm)))), 1fr);
    }
  }
  `;
  
  @property({type: Number}) sm? = 2;
  @property({type: Number}) md?: number;
  @property({type: Number}) lg?: number;
  @property({type: Number}) xl?: number;
  @property({type: Boolean, reflect: true}) nested?: boolean = false;
  
  override updated(changedProperties) {
    
    const sizes = ['sm', 'md', 'lg', 'xl'];
    
    sizes.forEach((size) => {
      if (changedProperties.has(size)) {
        const value = this[size];
        // Update the CSS variable dynamically
        this.style.setProperty(`--list-columns-${size}`, value?.toString() || '');
      }
    });
    
  }
  
  override render() {
    return html`
    <iu-container class="${this.nested ? 'is-nested' : ''}">
      <slot></slot>
    </iu-container>
    `;
  }
  
}

declare global {
  interface HTMLElementTagNameMap {
    'iu-list': List;
  }
}