/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
import { html } from "chrome://global/content/vendor/lit.all.mjs";
import { MozLitElement } from "chrome://global/content/lit-utils.mjs";
export default class FxviewCategoryNavigation extends MozLitElement {
// Use a relative URL in storybook to get faster reloads on style changes.
static stylesheetUrl = window.IS_STORYBOOK
? "./fxview-category-navigation.css"
: "chrome://browser/content/firefoxview/fxview-category-navigation.css";
static properties = {
currentCategory: { type: String },
};
static queries = {
categoryButtonsSlot: "slot[name=category-button]",
};
get categoryButtons() {
return this.categoryButtonsSlot
.assignedNodes()
.filter(node => !node.hidden);
}
onChangeCategory(e) {
this.currentCategory = e.target.name;
}
handleFocus(e) {
if (e.key == "ArrowDown" || e.key == "ArrowRight") {
e.preventDefault();
this.focusNextCategory();
} else if (e.key == "ArrowUp" || e.key == "ArrowLeft") {
e.preventDefault();
this.focusPreviousCategory();
}
}
focusPreviousCategory() {
let categoryButtons = this.categoryButtons;
let currentIndex = categoryButtons.findIndex(b => b.selected);
let prev = categoryButtons[currentIndex - 1];
if (prev) {
prev.activate();
prev.focus();
}
}
focusNextCategory() {
let categoryButtons = this.categoryButtons;
let currentIndex = categoryButtons.findIndex(b => b.selected);
let next = categoryButtons[currentIndex + 1];
if (next) {
next.activate();
next.focus();
}
}
render() {
return html`
`;
}
updated() {
let categorySelected = false;
let assignedCategories = this.categoryButtons;
for (let button of assignedCategories) {
button.selected = button.name == this.currentCategory;
categorySelected = categorySelected || button.selected;
}
if (!categorySelected && assignedCategories.length) {
// Current category has no matching category, reset to the first category.
assignedCategories[0].activate();
}
}
}
customElements.define("fxview-category-navigation", FxviewCategoryNavigation);
export class FxviewCategoryButton extends MozLitElement {
// Use a relative URL in storybook to get faster reloads on style changes.
static stylesheetUrl = window.IS_STORYBOOK
? "./fxview-category-button.css"
: "chrome://browser/content/firefoxview/fxview-category-button.css";
static properties = {
selected: { type: Boolean },
};
static queries = {
buttonEl: "button",
};
connectedCallback() {
super.connectedCallback();
this.setAttribute("role", "tab");
}
get name() {
return this.getAttribute("name");
}
activate() {
this.dispatchEvent(
new CustomEvent("change-category", {
bubbles: true,
composed: true,
})
);
}
render() {
return html`
`;
}
updated() {
this.setAttribute("aria-selected", this.selected);
this.setAttribute("tabindex", this.selected ? 0 : -1);
}
}
customElements.define("fxview-category-button", FxviewCategoryButton);