/** * Bongoto Theme – Main JS * File: assets/js/main.js * * Global interactions: mobile menu, search toggle, sticky header, mini-cart. */ (function () { 'use strict'; /* ---------------- Mobile Menu Toggle ---------------- */ const mobileToggle = document.querySelector('.bt-menu-toggle'); const menu = document.querySelector('.bt-primary-menu'); function closeMenu() { if (!menu) return; menu.classList.remove('is-open'); document.documentElement.classList.remove('bt-menu-open'); if (mobileToggle) mobileToggle.setAttribute('aria-expanded', 'false'); } if (mobileToggle && menu) { mobileToggle.addEventListener('click', function () { const expanded = this.getAttribute('aria-expanded') === 'true'; this.setAttribute('aria-expanded', String(!expanded)); menu.classList.toggle('is-open'); document.documentElement.classList.toggle('bt-menu-open', !expanded); }); // Close menu when clicking outside document.addEventListener('click', function (e) { if (!menu.classList.contains('is-open')) return; const withinMenu = menu.contains(e.target) || mobileToggle.contains(e.target); if (!withinMenu) closeMenu(); }); // Close on ESC document.addEventListener('keydown', function (e) { if (e.key === 'Escape') closeMenu(); }); } /* ---------------- Sticky Header ---------------- */ const header = document.querySelector('.bt-header'); if (header && header.classList.contains('bt-header--sticky')) { const onScroll = () => { if (window.scrollY > 10) header.classList.add('bt-header-scrolled'); else header.classList.remove('bt-header-scrolled'); }; window.addEventListener('scroll', onScroll, { passive: true }); onScroll(); } /* ---------------- Search Toggle ---------------- */ document.querySelectorAll('.bt-search-toggle').forEach((btn) => { btn.addEventListener('click', function () { const host = this.closest('.bt-header-search'); if (!host) return; const dropdown = host.querySelector('.bt-search-dropdown'); if (!dropdown) return; const isOpen = !dropdown.hasAttribute('hidden'); dropdown.hidden = isOpen; this.setAttribute('aria-expanded', String(!isOpen)); if (!isOpen) { // Focus first input when opened const firstInput = dropdown.querySelector('input, textarea, select'); if (firstInput) firstInput.focus({ preventScroll: true }); } }); }); // Close search dropdowns on outside click document.addEventListener('click', function (e) { document.querySelectorAll('.bt-search-dropdown').forEach((dd) => { const host = dd.closest('.bt-header-search'); const toggle = host ? host.querySelector('.bt-search-toggle') : null; const clickedInside = dd.contains(e.target) || (host && host.contains(e.target)); if (!clickedInside && !dd.hasAttribute('hidden')) { dd.hidden = true; if (toggle) toggle.setAttribute('aria-expanded', 'false'); } }); }); /* ---------------- Mini Cart Toggle ---------------- */ const cartLink = document.querySelector('.bt-cart-link'); const miniCart = document.querySelector('.bt-mini-cart'); if (cartLink && miniCart) { cartLink.addEventListener('click', function (e) { e.preventDefault(); const visible = miniCart.classList.toggle('is-visible'); // If using [hidden], keep in sync miniCart.hidden = !visible; this.setAttribute('aria-expanded', String(visible)); }); // Close when clicking outside document.addEventListener('click', function (e) { if (!miniCart.classList.contains('is-visible')) return; if (miniCart.contains(e.target) || cartLink.contains(e.target)) return; miniCart.classList.remove('is-visible'); miniCart.hidden = true; cartLink.setAttribute('aria-expanded', 'false'); }); } /* ---------------- Global: Close dropdowns on ESC ---------------- */ document.addEventListener('keydown', function (e) { if (e.key !== 'Escape') return; // Search document.querySelectorAll('.bt-search-dropdown').forEach((dd) => { dd.hidden = true; }); // Mini cart if (miniCart) { miniCart.classList.remove('is-visible'); miniCart.hidden = true; if (cartLink) cartLink.setAttribute('aria-expanded', 'false'); } // Menu closeMenu(); }); })(); /* ================= Woo Products Slider Controls ================= */ (function ($) { $(document).on('click', '.bt-ps-prev, .bt-ps-next', function (e) { e.preventDefault(); // Find the nearest products widget after the arrows block var $wrap = $(this).closest('.elementor-widget-html, .bt-ps-arrows'); var $shortcode = $wrap.nextAll('.elementor-widget-shortcode').first(); var $track = $shortcode.find('.bt-product-slider ul.products').first(); if (!$track.length) return; var $firstCard = $track.find('li.product').first(); var cardW = $firstCard.outerWidth(true) || 260; var visible = Math.max(1, Math.floor($track.innerWidth() / cardW)); var jump = cardW * Math.min(3, visible); // scroll by up to 3 cards or visible count var dir = $(this).hasClass('bt-ps-prev') ? -1 : 1; $track.animate({ scrollLeft: $track.scrollLeft() + dir * jump }, 280); }); })(jQuery);