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

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

/**
 * An example element.
 */

@customElement('iu-header-topbar')

export class SiteHeaderTopbar extends LitElement {
  static override styles = css`
    :host{
      background: var(--iu-color-black);
      height: 40px;
      display: none;
      align-items: center;
      font-size: 0.8125rem;
    }
    @media ${unsafeCSS(breakpoints.xl)} {
      :host{
        display: flex;
      }
    }
    :host nav ul{
      margin: 0;
      padding: 0;
      display: flex;
      list-style-type: none;
    }
    :host nav ul ::slotted(li:not(:last-child)){
      margin-right: 20px;
    }
    :host a{
      color: #fff;
      text-decoration: none;
    }
    :host iu-container{
      display: flex;
      align-items: center;
      justify-content: space-between;
      margin-bottom: 0;
    }
    :host div{
      display: flex;
      align-items: center;
      justify-content: space-between;
    }
    :host nav ul ::slotted(*){
      margin-right: 20px;
    }
    :host nav ul ::slotted(.last){
      margin-right: 0;
    }
    :host div svg{
      width: 1.375rem;
      height: 2.25rem;
      display: block;
    }
    :host div a{
      margin-left: 0.9375rem;
    }
  `;

  @property({type: Boolean}) i18n = false;
  @property({type: Boolean}) searchable = false;

  @queryAssignedNodes() private slottedElements?: NodeList;

  private getLastElement(){
    if (!this.slottedElements) return; //prevents accessing undefined
    const slotted = Array.from(this.slottedElements).filter(el => el instanceof HTMLElement) as HTMLElement[];
    if (slotted.length > 0) {
      slotted[slotted.length - 1].classList.add('last');
    }
  }

  protected override firstUpdated() {
    this.getLastElement();
  }

  override render() {
    return html`
      <iu-container>
        <nav role="navigation">
          <ul>
            <slot></slot>
          </ul>
        </nav>
        <div>
          ${this.i18n && html`<a href="#">EN</a>`}
          ${this.searchable ? html`<a href="#"><svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 22 37"><path fill-rule="evenodd" clip-rule="evenodd" d="M8.5 24a7.5 7.5 0 1 0 0-15 7.5 7.5 0 0 0 0 15Zm0 1a8.5 8.5 0 1 0 0-17 8.5 8.5 0 0 0 0 17Z" fill="currentColor"/><path fill-rule="evenodd" clip-rule="evenodd" d="m14.854 22.146 6.5 6.5-.707.708-6.5-6.5.707-.707Z" fill="currentColor"/></svg></a>` : ''}
        </div>
      </iu-container>
    `;
  }

}

declare global {
  interface HTMLElementTagNameMap {
    'iu-header-topbar': SiteHeaderTopbar;
  }
}