mirror of
https://github.com/bitcoinresearchkit/brk.git
synced 2026-06-30 22:09:00 -07:00
79 lines
1.8 KiB
JavaScript
79 lines
1.8 KiB
JavaScript
import { createElement } from "../../dom.js";
|
|
|
|
/**
|
|
* @typedef {Object} WalletTab
|
|
* @property {string} id
|
|
* @property {string} label
|
|
* @property {HTMLElement} panel
|
|
* @property {() => void} mount
|
|
*/
|
|
|
|
/**
|
|
* @param {WalletTab} tab
|
|
*/
|
|
function createTabButton(tab) {
|
|
const button = document.createElement("button");
|
|
|
|
button.type = "button";
|
|
button.role = "tab";
|
|
button.id = `wallet-tab-${tab.id}`;
|
|
button.setAttribute("aria-controls", `wallet-panel-${tab.id}`);
|
|
button.append(tab.label);
|
|
|
|
return button;
|
|
}
|
|
|
|
/**
|
|
* @param {WalletTab} tab
|
|
*/
|
|
function setupTabPanel(tab) {
|
|
tab.panel.id = `wallet-panel-${tab.id}`;
|
|
tab.panel.role = "tabpanel";
|
|
tab.panel.setAttribute("aria-labelledby", `wallet-tab-${tab.id}`);
|
|
}
|
|
|
|
/**
|
|
* @param {readonly WalletTab[]} tabs
|
|
*/
|
|
export function createWalletTabs(tabs) {
|
|
const element = createElement("section", "tabs");
|
|
const nav = document.createElement("nav");
|
|
const panels = document.createElement("div");
|
|
const buttons = tabs.map(createTabButton);
|
|
|
|
nav.setAttribute("aria-label", "Wallet sections");
|
|
nav.role = "tablist";
|
|
panels.append(...tabs.map((tab) => {
|
|
setupTabPanel(tab);
|
|
|
|
return tab.panel;
|
|
}));
|
|
nav.append(...buttons);
|
|
element.append(nav, panels);
|
|
|
|
/**
|
|
* @param {number} selectedIndex
|
|
*/
|
|
function select(selectedIndex) {
|
|
for (let index = 0; index < tabs.length; index += 1) {
|
|
const selected = index === selectedIndex;
|
|
|
|
buttons[index].setAttribute("aria-selected", String(selected));
|
|
buttons[index].tabIndex = selected ? 0 : -1;
|
|
tabs[index].panel.hidden = !selected;
|
|
}
|
|
|
|
tabs[selectedIndex].mount();
|
|
}
|
|
|
|
for (let index = 0; index < buttons.length; index += 1) {
|
|
buttons[index].addEventListener("click", () => {
|
|
select(index);
|
|
});
|
|
}
|
|
|
|
select(0);
|
|
|
|
return element;
|
|
}
|