@oslokommune/punkt-elements
Version:
Komponentbiblioteket til Punkt, et designsystem laget av Oslo Origo
67 lines (57 loc) • 2.04 kB
text/typescript
import { html } from 'lit'
import { customElement, property } from 'lit/decorators.js'
import { ref } from 'lit/directives/ref.js'
import { Ref, createRef } from 'lit/directives/ref.js'
import { PktElement } from '@/base-elements/element'
import { PktSlotController } from '@/controllers/pkt-slot-controller'
import '@/components/icon'
export type TLinkCardSkin =
| 'normal'
| 'blue'
| 'beige'
| 'green'
| 'gray'
| 'beige-outline'
| 'gray-outline'
export interface IPktLinkCard {
title?: string
href?: string
iconName?: string
external?: boolean
openInNewTab?: boolean
skin?: TLinkCardSkin
}
('pkt-linkcard')
export class PktLinkCard extends PktElement implements IPktLinkCard {
defaultSlot: Ref<HTMLElement> = createRef()
({ type: String, reflect: true }) title: string = ''
({ type: String, reflect: true }) href: string = '#'
({ type: String, reflect: true }) iconName: string = ''
({ type: Boolean, reflect: true }) external: boolean = false
({ type: Boolean, reflect: true }) openInNewTab: boolean = false
({ type: String, reflect: true }) skin: TLinkCardSkin = 'normal'
constructor() {
super()
this.slotController = new PktSlotController(this, this.defaultSlot)
}
render() {
const classes = ['pkt-linkcard', this.skin && `pkt-linkcard--${this.skin}`]
.filter(Boolean)
.join(' ')
const titleClasses = ['pkt-linkcard__title', this.external && 'pkt-link pkt-link--external']
.filter(Boolean)
.join(' ')
return html`
<a
href=${this.href}
class=${classes}
target=${this.openInNewTab ? '_blank' : '_self'}
rel=${this.openInNewTab ?? 'noopener noreferrer'}
>
${this.iconName && html`<pkt-icon class="pkt-link__icon" name="${this.iconName}" />`}
${this.title && html`<div class=${titleClasses}>${this.title}</div>`}
<div class="pkt-linkcard__text" ${ref(this.defaultSlot)}></div>
</a>
`
}
}