54 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			54 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
/* cspell:ignore uidom */
 | 
						|
((Drupal, once, { computePosition, offset, shift, flip }) => {
 | 
						|
  /**
 | 
						|
   * Attaches the dropdown behavior to all required triggers.
 | 
						|
   *
 | 
						|
   * @type {Drupal~behavior}
 | 
						|
   *
 | 
						|
   * @prop {Drupal~behaviorAttach} attach
 | 
						|
   *   Attaches the dropdown behavior.
 | 
						|
   */
 | 
						|
  Drupal.behaviors.dropdownInit = {
 | 
						|
    attach: (context) => {
 | 
						|
      once('dropdown-trigger', '[data-drupal-dropdown]', context).forEach(
 | 
						|
        (trigger) => {
 | 
						|
          const dropdown = trigger.nextElementSibling;
 | 
						|
 | 
						|
          const updatePosition = () => {
 | 
						|
            computePosition(trigger, dropdown, {
 | 
						|
              strategy: 'fixed',
 | 
						|
              placement: trigger.dataset.drupalDropdownPosition || 'bottom',
 | 
						|
              middleware: [
 | 
						|
                flip({ padding: 16 }),
 | 
						|
                offset(6),
 | 
						|
                shift({ padding: 16 }),
 | 
						|
              ],
 | 
						|
            }).then(({ x, y }) => {
 | 
						|
              Object.assign(dropdown.style, {
 | 
						|
                left: `${x}px`,
 | 
						|
                top: `${y}px`,
 | 
						|
              });
 | 
						|
            });
 | 
						|
          };
 | 
						|
 | 
						|
          trigger.addEventListener('click', (e) => {
 | 
						|
            updatePosition();
 | 
						|
            trigger.setAttribute(
 | 
						|
              'aria-expanded',
 | 
						|
              e.currentTarget.getAttribute('aria-expanded') === 'false',
 | 
						|
            );
 | 
						|
          });
 | 
						|
 | 
						|
          // Event listener to close dropdown when clicking outside
 | 
						|
          document.addEventListener('click', (e) => {
 | 
						|
            const isButtonClicked = trigger.contains(e.target);
 | 
						|
            if (!isButtonClicked) {
 | 
						|
              trigger.setAttribute('aria-expanded', 'false');
 | 
						|
            }
 | 
						|
          });
 | 
						|
        },
 | 
						|
      );
 | 
						|
    },
 | 
						|
  };
 | 
						|
})(Drupal, once, FloatingUIDOM);
 |