@oslokommune/punkt-elements
Version:
Komponentbiblioteket til Punkt, et designsystem laget av Oslo Origo
101 lines (87 loc) • 3.39 kB
text/typescript
import { customElement, property } from 'lit/decorators.js'
import { html, nothing } from 'lit'
import { PktElement } from '@/base-elements/element'
import '@/components/icon'
export interface IBreadcrumbItem {
text: string
href: string
}
export interface IPktBreadcrumbs {
breadcrumbs: IBreadcrumbItem[]
}
export class PktBreadcrumbs extends PktElement implements IPktBreadcrumbs {
({ type: Array }) breadcrumbs: IBreadcrumbItem[] = []
private handleLinkClick(event: MouseEvent, item: IBreadcrumbItem, index: number) {
const navigateEvent = new CustomEvent('navigate', {
detail: { item, index, originalEvent: event },
bubbles: true,
composed: true,
cancelable: true,
})
const dispatched = this.dispatchEvent(navigateEvent)
// dispatchEvent returnerer false når en lytter kaller preventDefault() på navigate-eventet.
// Vi viderefører dette til den opprinnelige klikk-eventen for å hindre nettleseren i å navigere.
if (!dispatched) {
event.preventDefault()
}
}
render() {
if (!this.breadcrumbs || this.breadcrumbs.length === 0) return nothing
const backLink = this.breadcrumbs[this.breadcrumbs.length - 2]
return html`
<nav class="pkt-breadcrumbs" aria-label="brødsmulemeny">
<ol class="pkt-breadcrumbs__list pkt-breadcrumbs--desktop">
${this.breadcrumbs.map((item, index) =>
index === this.breadcrumbs.length - 1
? html`
<li class="pkt-breadcrumbs__item">
<span class="pkt-breadcrumbs__label" aria-current="true">
<span class="pkt-breadcrumbs__text">${item.text}</span>
</span>
</li>
`
: html`
<li class="pkt-breadcrumbs__item">
<a
class="pkt-link pkt-link--icon-right pkt-breadcrumbs__label pkt-breadcrumbs__link"
href=${item.href}
@click=${(e: MouseEvent) => this.handleLinkClick(e, item, index)}
>
<pkt-icon
class="pkt-icon pkt-breadcrumbs__icon pkt-link__icon"
name="chevron-thin-right"
aria-hidden="true"
></pkt-icon>
<span class="pkt-breadcrumbs__text">${item.text}</span>
</a>
</li>
`,
)}
</ol>
${backLink
? html`
<a
class="pkt-link pkt-link--icon-left pkt-breadcrumbs--mobile"
href=${backLink.href}
@click=${(e: MouseEvent) =>
this.handleLinkClick(e, backLink, this.breadcrumbs.length - 2)}
>
<pkt-icon
class="pkt-back-link__icon pkt-icon pkt-link__icon"
name="chevron-thin-left"
aria-hidden="true"
></pkt-icon>
<span class="pkt-breadcrumbs__text">${backLink.text}</span>
</a>
`
: nothing}
</nav>
`
}
}
export default PktBreadcrumbs
try {
customElement('pkt-breadcrumbs')(PktBreadcrumbs)
} catch (e) {
console.warn('Forsøker å definere <pkt-breadcrumbs>, men den er allerede definert')
}