Newer
Older
iuav-ui / src / components / grid / grid-column.ts
/**
 * @license
 * Copyright 2019 Google LLC
 * SPDX-License-Identifier: BSD-3-Clause
 */

import {LitElement, html, css, unsafeCSS} from 'lit';
import {customElement, property, query} from 'lit/decorators.js';
import { breakpoints } from '../../breakpoints';

@customElement('iu-column')

export class GridColumn extends LitElement {
  static override styles = css`
    :host{
      display: block;
      grid-column: span var(--column-span-sm, 1);
    }
    @media ${unsafeCSS(breakpoints.md)} {
      :host{
          grid-column: span var(--column-span-md, var(--column-span-sm, 1));
      }
    }
    @media ${unsafeCSS(breakpoints.lg)} {
      :host{
          grid-column: span var(--column-span-lg, var(--column-span-md, var(--column-span-sm, 1)));
      }
    }
    @media ${unsafeCSS(breakpoints.xl)} {
      :host{
          grid-column: span var(--column-span-xl, var(--column-span-lg, var(--column-span-md, var(--column-span-sm, 1))));
      }
      :host([sticky]){
        position: sticky;
        top: var(--column-sticky-top, 0);
        align-self: start;
      }
    }
  `;

  @property({type: Number}) sm: number = 12;
  @property({type: Number}) md?: number;
  @property({type: Number}) lg?: number;
  @property({type: Number}) xl?: number;
  @property({type: Boolean}) sticky?: false;
  @property({type: Number}) top?: number;
  
  @query('slot') slotElement!: HTMLSlotElement;

  // make sure that every component inside this component has <iu-container> set 
  // to nested to disable padding left on the container itself
  private updateSlottedElements() {
    // Get all slotted elements
    const slottedElements = this.slotElement.assignedElements({ flatten: true });
    slottedElements.forEach((slot) => {
      if (slot instanceof HTMLElement) {
        console.log('test')
          // Set the `nested` attribute or property
          slot.setAttribute('nested', 'true');
      }
    });
  }
  
  override firstUpdated() {
    super.firstUpdated();
    this.updateSlottedElements();
  }


  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(`--column-span-${size}`, value?.toString() || '');
      }
    });

    if(this.sticky){
      this.top && this.style.setProperty(`--column-sticky-top`, `${Math.round(this.top/16)}rem`);
    }

    if(this.sticky && this.top){
    }

  }

  override render() {
    return html`
        <slot></slot>
    `;
  }

}

declare global {
  interface HTMLElementTagNameMap {
    'iu-column': GridColumn;
  }
}