@oslokommune/punkt-elements
Version:
Komponentbiblioteket til Punkt, et designsystem laget av Oslo Origo
106 lines (94 loc) • 3.3 kB
text/typescript
import { PktElementWithSlot } from '@/base-elements/element-with-slot'
import { slotContent } from '@/directives/slot-content'
import { html, PropertyValues } from 'lit'
import { customElement, property } from 'lit/decorators.js'
import { createRef, Ref, ref } from 'lit/directives/ref.js'
import { TPktAccordionSkin } from './accordion'
import { classMap } from 'lit/directives/class-map.js'
import { ifDefined } from 'lit/directives/if-defined.js'
/**
* @param toggleProps
*
* @description Send in an "isOpen" boolean and "onToggleClick" function
* to override the automatic toggling
*/
export interface IPktAccordionItem {
defaultOpen?: boolean
id: string
title: string
skin?: TPktAccordionSkin
compact?: boolean
isOpen?: boolean
name?: string | undefined
}
export class PktAccordionItem extends PktElementWithSlot implements IPktAccordionItem {
({ type: Boolean }) defaultOpen: boolean = false
({ type: String }) title: string = ''
({ type: String, reflect: true }) skin: TPktAccordionSkin | undefined = undefined
({ type: Boolean, reflect: true }) compact: boolean = false
({ type: Boolean, reflect: true }) isOpen: boolean = false
({ type: String, reflect: true }) name: string | undefined = undefined
accordionItemRef: Ref<HTMLDivElement> = createRef()
constructor() {
super()
}
protected firstUpdated(_changedProperties: PropertyValues): void {
if (this.defaultOpen) {
this.isOpen = true
}
}
render() {
const accordionItemClass = {
'pkt-accordion-item': true,
'pkt-accordion-item--compact': this.compact,
[`pkt-accordion-item--${this.skin}`]: !!this.skin,
}
const isPlusMinus = this.skin === 'plus-minus'
return html`
<details
class=${classMap(accordionItemClass)}
id=${this.id}
?open=${this.isOpen}
${ref(this.accordionItemRef)}
name=${ifDefined(this.name)}
>
<summary class="pkt-accordion-item__title" id=${`pkt-accordion-item-summary-${this.id}`}>
${this.title}
${isPlusMinus
? html`
<pkt-icon
name="plus-sign"
class="pkt-accordion-item__icon pkt-accordion-item__icon--plus"
aria-hidden="true"
></pkt-icon>
<pkt-icon
name="minus-sign"
class="pkt-accordion-item__icon pkt-accordion-item__icon--minus"
aria-hidden="true"
></pkt-icon>
`
: html`
<pkt-icon
name="chevron-thin-down"
class="pkt-accordion-item__icon"
aria-hidden="true"
></pkt-icon>
`}
</summary>
<div
class="pkt-accordion-item__content"
id="pkt-accordion-item__content-${this.id}"
role="region"
>
<div class="pkt-accordion-item__content-inner">${slotContent(this)}</div>
</div>
</details>
`
}
}
export default PktAccordionItem
try {
customElement('pkt-accordion-item')(PktAccordionItem)
} catch (e) {
console.warn('Forsøker å definere <pkt-accordion-item>, men den er allerede definert')
}