in kitsune/sumo/static/sumo/js/sumo-tabs.js [1:93]
export default function tabsInit() {
const container = document.querySelector('.tabs');
// insert "more" button and duplicate the list
if (container) {
const existingMoreBtn = container.querySelector('.tabs--item-more');
const primary = container.querySelector('.tabs--list');
const primaryItems = container.querySelectorAll('.tabs--list > li:not(.tabs--item-more)');
container.classList.add('is-js-enhanced');
// reset in the event that this is run twice.
if (existingMoreBtn) {
existingMoreBtn.remove();
}
primary.insertAdjacentHTML('beforeend', `
<li class="tabs--item-more">
<button class="tabs--button" type="button" aria-haspopup="true" aria-expanded="false">
${gettext("More")}
</button>
<ul class="tabs--dropdown elevation-01">
${primary.innerHTML}
</ul>
</li>
`)
const secondary = container.querySelector('.tabs--dropdown');
const secondaryItems = secondary.querySelectorAll('li');
const allItems = container.querySelectorAll('li');
const moreLi = primary.querySelector('.tabs--item-more');
const moreBtn = moreLi.querySelector('button');
moreBtn.addEventListener('click', (e) => {
e.preventDefault();
container.classList.toggle('dropdown-is-open');
moreBtn.setAttribute('aria-expanded', container.classList.contains('dropdown-is-open'));
});
// adapt tabs
const doAdapt = () => {
// reveal all items for the calculation
allItems.forEach((item) => {
item.classList.remove('is-hidden');
});
// is-hidden items that won't fit in the Primary
let stopWidth = moreBtn.offsetWidth;
let hiddenItems = [];
const primaryWidth = primary.offsetWidth;
primaryItems.forEach((item, i) => {
if(primaryWidth >= stopWidth + item.offsetWidth) {
stopWidth += item.offsetWidth;
} else {
item.classList.add('is-hidden');
hiddenItems.push(i);
}
});
// toggle the visibility of More button and items in Secondary
if (!hiddenItems.length) {
moreLi.classList.add('is-hidden');
container.classList.remove('dropdown-is-open');
moreBtn.setAttribute('aria-expanded', false);
}
else {
secondaryItems.forEach((item, i) => {
if(!hiddenItems.includes(i)) {
item.classList.add('is-hidden');
}
});
}
}
doAdapt(); // adapt immediately on load
window.addEventListener('resize', doAdapt); // adapt on window resize
// is-hidden Secondary on the outside click
document.addEventListener('click', (e) => {
let el = e.target;
while(el) {
if(el === secondary || el === moreBtn) {
return;
}
el = el.parentNode;
}
container.classList.remove('dropdown-is-open');
moreBtn.setAttribute('aria-expanded', false);
});
}
};