import { html, render } from "/js/lib/lit-html.js";
import { Component } from "/js/components/component.js";
import { classnames } from "/js/utils.js";
class TabBar extends Component {
static observedAttributes = ["active-tab", "full-width"];
connectedCallback() {
if (this.initialized) return;
this._tabs = this._tabs ?? [];
this.lastScrolledTab = null;
this.render();
this.initialized = true;
}
attributeChangedCallback() {
if (!this.initialized) return;
this.render();
}
set tabs(tabs) {
this._tabs = tabs ?? [];
if (this.initialized) this.render();
}
get tabs() {
return this._tabs;
}
get activeTab() {
return this.getAttribute("active-tab");
}
get fullWidth() {
return this.hasAttribute("full-width");
}
render() {
const activeTab = this.activeTab;
render(
html`${this._tabs.map(
(tab) =>
html``,
)}`,
this,
);
this.scrollActiveIntoView();
}
scrollActiveIntoView() {
if (this.fullWidth) return;
const activeTab = this.activeTab;
if (activeTab === this.lastScrolledTab) return;
const activeButton = this.querySelector(".tab-bar-button.active");
if (!activeButton) return;
const behavior = this.lastScrolledTab === null ? "instant" : "smooth";
this.lastScrolledTab = activeTab;
requestAnimationFrame(() => {
activeButton.scrollIntoView({
behavior,
inline: "nearest",
block: "nearest",
});
});
}
}
TabBar.register();