/**
* ============================================================================
* NAME: flyout-shop.js
* PATH: /brand-kit/js/flyout-shop.js
* VERSION: 1.0.0
* PURPOSE: Custom Shop flyout (replaces Max Mega Menu)
*
* BEHAVIOR:
* - Desktop: Hover "Shop" → opens, mouse leave → closes
* - Tablet: Tap "Shop" → opens, tap outside → closes
* - Click/tap category → navigates, flyout closes
* - No timeouts, no animations, purely functional
*
* FALLBACK: If JS fails, nothing breaks — "Shop" just has no action
* ============================================================================
*/
(function() {
'use strict';
// Wait for DOM to be ready
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', init);
} else {
init();
}
function init() {
const shopLink = document.querySelector('#menu-item-410 a'); // "Shop" menu link
const body = document.body;
let flyout = null;
let overlay = null;
let isOpen = false;
let closeTimeout = null;
// If "Shop" link doesn't exist, exit silently
if (!shopLink) return;
// Create flyout panel and overlay (injected once)
function createElements() {
if (flyout) return;
// Full-screen black overlay (90% opacity)
overlay = document.createElement('div');
overlay.id = 'mma-flyout-overlay';
overlay.style.cssText = `
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.9);
z-index: var(--mma-z-overlay, 900);
display: none;
pointer-events: auto;
`;
// Flyout panel (will be styled by CSS)
flyout = document.createElement('div');
flyout.id = 'mma-flyout-panel';
flyout.style.cssText = `
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
display: none;
pointer-events: auto;
z-index: calc(var(--mma-z-overlay, 900) + 1);
`;
body.appendChild(overlay);
body.appendChild(flyout);
}
// Open flyout (copies mega menu content into panel)
function openFlyout() {
if (isOpen) return;
createElements();
// Find existing mega menu content from MMM (or custom markup)
const megaMenuContent = document.querySelector('#menu-item-410 .mega-sub-menu');
if (!megaMenuContent) return;
// Clone content into flyout
flyout.innerHTML = '';
const clone = megaMenuContent.cloneNode(true);
flyout.appendChild(clone);
overlay.style.display = 'block';
flyout.style.display = 'block';
isOpen = true;
body.style.overflow = 'hidden'; // Prevent scroll while open
}
// Close flyout
function closeFlyout() {
if (!isOpen) return;
overlay.style.display = 'none';
flyout.style.display = 'none';
isOpen = false;
body.style.overflow = '';
}
// Delayed close (for mouse leave)
function scheduleClose() {
if (closeTimeout) clearTimeout(closeTimeout);
closeTimeout = setTimeout(closeFlyout, 50);
}
function cancelClose() {
if (closeTimeout) {
clearTimeout(closeTimeout);
closeTimeout = null;
}
}
// DESKTOP: Hover events
shopLink.addEventListener('mouseenter', openFlyout);
shopLink.addEventListener('mouseleave', scheduleClose);
if (flyout) {
flyout.addEventListener('mouseenter', cancelClose);
flyout.addEventListener('mouseleave', scheduleClose);
overlay.addEventListener('mouseenter', cancelClose);
overlay.addEventListener('mouseleave', scheduleClose);
}
// TABLET / TOUCH: Tap outside closes
document.addEventListener('click', function(e) {
if (!isOpen) return;
// If click is outside flyout AND not on shop link, close
if (flyout && !flyout.contains(e.target) && e.target !== shopLink) {
closeFlyout();
}
});
// If user taps "Shop" while open, close it
shopLink.addEventListener('click', function(e) {
if (isOpen) {
e.preventDefault();
closeFlyout();
} else {
e.preventDefault();
openFlyout();
}
});
// Optional: Close on ESC key
document.addEventListener('keydown', function(e) {
if (e.key === 'Escape' && isOpen) {
closeFlyout();
}
});
}
})();
Warning: Cannot modify header information - headers already sent by (output started at /srv/users/magicalmemes/apps/magicalmemes/public/wp-content/mu-plugins/brand-kit/js/flyout-shop.js:1) in /srv/users/magicalmemes/apps/magicalmemes/public/wp-includes/pluggable.php on line 1535
Warning: Cannot modify header information - headers already sent by (output started at /srv/users/magicalmemes/apps/magicalmemes/public/wp-content/mu-plugins/brand-kit/js/flyout-shop.js:1) in /srv/users/magicalmemes/apps/magicalmemes/public/wp-includes/pluggable.php on line 1538