Files
drupal11-ddev/web/core/modules/navigation/js/toolbar-dropdown.js
2025-10-08 11:39:17 -04:00

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);