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

export class Link extends LitElement {
  static override styles = css`
    :host{
        display: block;
        --iu-comp-bg: transparent;
        --iu-comp-color: var(--iu-color-black);
        --iu-comp-bg-hover: var(--iu-color-black);
        --iu-comp-color-hover: var(--iu-color-white);
        --iu-comp-border-color: var(--iu-color-grey-200);
        --iu-comp-border-color-hover: var(--iu-color-grey-500);
        // margin-bottom: var(--iu-spacing-3);
    }
    @media ${unsafeCSS(breakpoints.md)} {
        :host{
            // margin-bottom: var(--iu-spacing-6);
        }
    }
    a{
        background: var(--iu-comp-bg);
        color: var(--iu-comp-color);
        font: var(--iu-f-2);
        text-decoration: none;
        border-top: 1px solid var(--iu-comp-border-color);
        position: relative;
        display: flex;
    }
    a.size-2{
        font: var(--iu-f-lg);
    }
    a:hover{
        background: var(--iu-comp-bg-hover);
        color: var(--iu-comp-color-hover);
    }
    svg{
        width: 2.25rem;
        height: 2.25rem;
        margin-right: var(--iu-spacing-0);
        flex-shrink: 0;
    }
    .size-2 svg{
        width: 3.125rem;
        height: 3.125rem;
        margin-right: var(--iu-spacing-1);
    }
    a > span{
        padding-top: 0.375rem;
        padding-bottom: 0.375rem;
        // padding-right: 1.25rem;
    }
    a span span{
        display: inline-block;
        font: var(--iu-f-0);
        color: var(--iu-color-grey-300);
        transform: translateY(-0.875rem);
    }
    iu-container{
        margin-bottom: 0;
    }
  `;

  @property() href?: string;
  @property() text?: string;
  @property() label?: string;
  @property() target?: string = "_self";
  @property({type: Number}) size = 1;
  @property({type: Boolean, reflect: true}) nested?: boolean = false;

  override render() {
    return html`
        <iu-container ?nested=${this.nested}>
            <a href="${this.href}" class="size-${this.size}" target="${this.target}">
                ${this.label
                ? html`
                    <svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 50 50"><path d="m21.082 16.215 12.257.471m0 0 .47 12.257m-.47-12.257L15.66 34.364" stroke="currentColor" stroke-width="2"/></svg>`
                : html`
                    <svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 50 50"><path d="M28.667 16 37 25m0 0-8.333 9M37 25H12" stroke="currentColor" stroke-width="2"/></svg>`
                }
                <span>
                    ${this.text}
                    ${this.label && html`<span>${this.label}</span>`}
                </span>
            </a>
        </iu-container>
    `;
  }

}

declare global {
  interface HTMLElementTagNameMap {
    'iu-link': Link;
  }
}