70 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			70 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
/**
 | 
						|
 * @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('olivero-tabs', '[data-drupal-nav-primary-tabs]', context).forEach(
 | 
						|
        init,
 | 
						|
      );
 | 
						|
    },
 | 
						|
  };
 | 
						|
})(Drupal, once);
 |