You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
69 lines
1.8 KiB
69 lines
1.8 KiB
/** |
|
* @file |
|
* Provides interactivity for showing and hiding the primary tabs at mobile widths. |
|
*/ |
|
|
|
((Drupal, once) => { |
|
/** |
|
* Initialize the primary tabs. |
|
* |
|
* @param {HTMLElement} el |
|
* The DOM element containing the primary tabs. |
|
*/ |
|
function init(el) { |
|
const tabs = el.querySelector('.tabs'); |
|
const expandedClass = 'is-expanded'; |
|
const activeTab = tabs.querySelector('.is-active'); |
|
|
|
/** |
|
* Determines if primary tabs are expanded for mobile layouts. |
|
* |
|
* @return {boolean} |
|
* Whether the tabs trigger element is expanded. |
|
*/ |
|
function isTabsMobileLayout() { |
|
return tabs.querySelector('.tabs__trigger').clientHeight > 0; |
|
} |
|
|
|
/** |
|
* Controls primary tab visibility on click events. |
|
* |
|
* @param {Event} e |
|
* The event object. |
|
*/ |
|
function handleTriggerClick(e) { |
|
e.currentTarget.setAttribute( |
|
'aria-expanded', |
|
!tabs.classList.contains(expandedClass), |
|
); |
|
tabs.classList.toggle(expandedClass); |
|
} |
|
|
|
if (isTabsMobileLayout() && !activeTab.matches('.tabs__tab:first-child')) { |
|
const newActiveTab = activeTab.cloneNode(true); |
|
const firstTab = tabs.querySelector('.tabs__tab:first-child'); |
|
tabs.insertBefore(newActiveTab, firstTab); |
|
tabs.removeChild(activeTab); |
|
} |
|
|
|
tabs |
|
.querySelector('.tabs__trigger') |
|
.addEventListener('click', handleTriggerClick); |
|
} |
|
|
|
/** |
|
* Initialize the primary tabs. |
|
* |
|
* @type {Drupal~behavior} |
|
* |
|
* @prop {Drupal~behaviorAttach} attach |
|
* Display primary tabs according to the screen width. |
|
*/ |
|
Drupal.behaviors.primaryTabs = { |
|
attach(context) { |
|
once('olives-tabs', '[data-drupal-nav-primary-tabs]', context).forEach( |
|
init, |
|
); |
|
}, |
|
}; |
|
})(Drupal, once);
|
|
|