import { Elena, html, unsafeHTML } from '@elenajs/core'; import type { LitroTabItem } from './litro-tab-item.js'; /** * * Content A * Content B * * * Light DOM tabs — discovers children via querySelectorAll. */ export class LitroTabs extends Elena(HTMLElement) { static tagName = 'litro-tabs'; static props = ['_labels', '_selectedIndex']; _labels: string[] = []; _selectedIndex = 0; private _items(): LitroTabItem[] { return Array.from(this.querySelectorAll('litro-tab-item')) as LitroTabItem[]; } override connectedCallback() { super.connectedCallback(); this._syncItems(); } private _syncItems() { const items = this._items(); this._labels = items.map((item, i) => item.label || `Tab ${i + 1}`); this._selectIndex(this._selectedIndex < items.length ? this._selectedIndex : 0, items); } private _selectIndex(index: number, items?: LitroTabItem[]) { const all = items ?? this._items(); this._selectedIndex = index; all.forEach((item, i) => { if (i === index) { item.setAttribute('selected', ''); item.selected = true; } else { item.removeAttribute('selected'); item.selected = false; } }); } _handleTabClick(index: number) { this._selectIndex(index); } render() { const tabButtons = this._labels.map((label, i) => `` ).join(''); return html`
${unsafeHTML(tabButtons)}
${unsafeHTML(this.innerHTML)}
`; } } LitroTabs.define(); export default LitroTabs;