91 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			91 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * @file
							 | 
						||
| 
								 | 
							
								 * Responsive navigation tabs.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * This also supports collapsible navigable is the 'is-collapsible' class is
							 | 
						||
| 
								 | 
							
								 * added to the main element, and a target element is included.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								(($, Drupal) => {
							 | 
						||
| 
								 | 
							
								  function init(tab) {
							 | 
						||
| 
								 | 
							
								    const $tab = $(tab);
							 | 
						||
| 
								 | 
							
								    const $target = $tab.find('[data-drupal-nav-tabs-target]');
							 | 
						||
| 
								 | 
							
								    const $active = $target.find('.js-active-tab');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    const openMenu = () => {
							 | 
						||
| 
								 | 
							
								      $target.toggleClass('is-open');
							 | 
						||
| 
								 | 
							
								      $target.find('button').attr('aria-expanded', $target.hasClass('is-open'));
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    const toggleOrder = (reset) => {
							 | 
						||
| 
								 | 
							
								      const current = $active.index();
							 | 
						||
| 
								 | 
							
								      const original = $active.data('original-order');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      // Do not change order if already first or if already reset.
							 | 
						||
| 
								 | 
							
								      if (original === 0 || reset === (current === original)) {
							 | 
						||
| 
								 | 
							
								        return;
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      const siblings = {
							 | 
						||
| 
								 | 
							
								        first: '[data-original-order="0"]',
							 | 
						||
| 
								 | 
							
								        previous: `[data-original-order="${original - 1}"]`,
							 | 
						||
| 
								 | 
							
								      };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      const $first = $target.find(siblings.first);
							 | 
						||
| 
								 | 
							
								      const $previous = $target.find(siblings.previous);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      if (reset && current !== original) {
							 | 
						||
| 
								 | 
							
								        $active.insertAfter($previous);
							 | 
						||
| 
								 | 
							
								      } else if (!reset && current === original) {
							 | 
						||
| 
								 | 
							
								        $active.insertBefore($first);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    const toggleCollapsed = ({ matches }) => {
							 | 
						||
| 
								 | 
							
								      if (matches) {
							 | 
						||
| 
								 | 
							
								        if ($tab.hasClass('is-horizontal') && !$tab.attr('data-width')) {
							 | 
						||
| 
								 | 
							
								          let width = 0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								          $target.find('.js-tabs-link').each((index, value) => {
							 | 
						||
| 
								 | 
							
								            width += $(value).outerWidth();
							 | 
						||
| 
								 | 
							
								          });
							 | 
						||
| 
								 | 
							
								          $tab.attr('data-width', width);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        // Collapse the tabs if the combined width of the tabs is greater than
							 | 
						||
| 
								 | 
							
								        // the width of the parent container.
							 | 
						||
| 
								 | 
							
								        const isHorizontal = $tab.attr('data-width') <= $tab.outerWidth();
							 | 
						||
| 
								 | 
							
								        $tab.toggleClass('is-horizontal', isHorizontal);
							 | 
						||
| 
								 | 
							
								        $tab.find('button').attr('aria-expanded', null);
							 | 
						||
| 
								 | 
							
								        toggleOrder(isHorizontal);
							 | 
						||
| 
								 | 
							
								      } else {
							 | 
						||
| 
								 | 
							
								        toggleOrder(false);
							 | 
						||
| 
								 | 
							
								        $tab.find('button').attr('aria-expanded', 'false');
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    $tab.addClass('position-container is-horizontal-enabled');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    $target.find('.js-tab').each((index, element) => {
							 | 
						||
| 
								 | 
							
								      const $item = $(element);
							 | 
						||
| 
								 | 
							
								      $item.attr('data-original-order', $item.index());
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    $tab.on('click.tabs', '[data-drupal-nav-tabs-trigger]', openMenu);
							 | 
						||
| 
								 | 
							
								    const mql = window.matchMedia('(min-width: 48em)');
							 | 
						||
| 
								 | 
							
								    mql.addEventListener('change', toggleCollapsed);
							 | 
						||
| 
								 | 
							
								    toggleCollapsed(mql);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  /**
							 | 
						||
| 
								 | 
							
								   * Initialize the tabs JS.
							 | 
						||
| 
								 | 
							
								   */
							 | 
						||
| 
								 | 
							
								  Drupal.behaviors.navTabs = {
							 | 
						||
| 
								 | 
							
								    attach(context) {
							 | 
						||
| 
								 | 
							
								      once(
							 | 
						||
| 
								 | 
							
								        'nav-tabs',
							 | 
						||
| 
								 | 
							
								        '[data-drupal-nav-tabs].is-collapsible',
							 | 
						||
| 
								 | 
							
								        context,
							 | 
						||
| 
								 | 
							
								      ).forEach(init);
							 | 
						||
| 
								 | 
							
								    },
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								})(jQuery, Drupal);
							 |