1/** 2 * Profile Menu Block - Frontend JavaScript 3 * Handles the dropdown toggle functionality 4 */ 5 6(function() { 7 'use strict'; 8 9 function initProfileMenu() { 10 const menuButtons = document.querySelectorAll('.wp-block-memberpress-pro-profile-menu__button'); 11 12 menuButtons.forEach(function(button) { 13 button.addEventListener('click', function(e) { 14 e.preventDefault(); 15 e.stopPropagation(); 16 17 const buttonGroup = button.closest('.wp-block-memberpress-pro-profile-menu__button-group'); 18 const dropdown = buttonGroup.querySelector('.wp-block-memberpress-pro-profile-menu__dropdown'); 19 20 if (!dropdown) return; 21 22 // Toggle dropdown 23 const isExpanded = button.getAttribute('aria-expanded') === 'true'; 24 25 // Close all other dropdowns first 26 document.querySelectorAll('.wp-block-memberpress-pro-profile-menu__button').forEach(function(otherButton) { 27 if (otherButton !== button) { 28 otherButton.setAttribute('aria-expanded', 'false'); 29 const otherDropdown = otherButton.closest('.wp-block-memberpress-pro-profile-menu__button-group').querySelector('.wp-block-memberpress-pro-profile-menu__dropdown'); 30 if (otherDropdown) { 31 otherDropdown.style.display = 'none'; 32 } 33 } 34 }); 35 36 // Toggle current dropdown 37 if (isExpanded) { 38 button.setAttribute('aria-expanded', 'false'); 39 dropdown.style.display = 'none'; 40 } else { 41 button.setAttribute('aria-expanded', 'true'); 42 dropdown.style.display = 'block'; 43 } 44 }); 45 }); 46 47 // Close dropdown when clicking outside 48 document.addEventListener('click', function(e) { 49 const isProfileMenu = e.target.closest('.wp-block-memberpress-pro-profile-menu'); 50 51 if (!isProfileMenu) { 52 document.querySelectorAll('.wp-block-memberpress-pro-profile-menu__button').forEach(function(button) { 53 button.setAttribute('aria-expanded', 'false'); 54 }); 55 document.querySelectorAll('.wp-block-memberpress-pro-profile-menu__dropdown').forEach(function(dropdown) { 56 dropdown.style.display = 'none'; 57 }); 58 } 59 }); 60 61 // Close dropdown on escape key 62 document.addEventListener('keydown', function(e) { 63 if (e.key === 'Escape') { 64 document.querySelectorAll('.wp-block-memberpress-pro-profile-menu__button').forEach(function(button) { 65 button.setAttribute('aria-expanded', 'false'); 66 }); 67 document.querySelectorAll('.wp-block-memberpress-pro-profile-menu__dropdown').forEach(function(dropdown) { 68 dropdown.style.display = 'none'; 69 }); 70 } 71 }); 72 } 73 74 // Initialize on DOM ready 75 if (document.readyState === 'loading') { 76 document.addEventListener('DOMContentLoaded', initProfileMenu); 77 } else { 78 initProfileMenu(); 79 } 80})();
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.