import { LitElement, css, html } from "lit"; import { property } from "lit/decorators.js"; const isSelected = (item: HTMLElement, attrForSelected: string, selection: string) => item[attrForSelected] === selection || Array.from(item.attributes).some( (attr) => attr.name === attrForSelected && attr.value === selection, ); export class PrimariaContentSwitcher extends LitElement { render() { return html` `; } static styles = css` :host { display: flex; flex: 1; } :host > ::slotted(:not(slot):not(.selected)) { display: none !important; } `; @property() selected: any; @property() attrForSelected: string; @property() animation = "fade"; updated(props): any { this.select(); } get items(): HTMLCollection { return this.children; } selectIndex() { return this.selected || this.selected === 0 ? this.attrForSelected ? Array.from(this.items).findIndex((item: any) => isSelected(item, this.attrForSelected, this.selected), ) : Number.parseInt(this.selected) : -1; } select() { if (this.items.length) { const index = this.selectIndex(); if (index !== -1) { const items = Array.from(this.items); items.forEach((i) => i.classList.remove("selected")); items[index]?.classList.add("selected"); } } } doAnimation(item) { switch (this.animation) { case "fade": return item?.classList.add("fade-in"); case "slideDown": return item?.classList.add("slide-down"); case "slideLeft": return item?.classList.add("slide-left"); case "slideRight": return item?.classList.add("slide-right"); case "disabled": return; default: return item?.classList.add("fade-in"); } } }