HEX
Server: LiteSpeed
System: Linux premium212.web-hosting.com 4.18.0-553.124.4.lve.el8.x86_64 #1 SMP Fri May 15 13:02:13 UTC 2026 x86_64
User: vitanhod (1367)
PHP: 8.2.31
Disabled: NONE
Upload Files
File: /home/vitanhod/barnabites.es/wp-content/themes/rishi/js/offcanvasToggle.js
import submenuToggle from "./submenuToggle";
import setStyle from "./setStyle";

function offcanvasToggle() {

	const site = document.querySelector('.site-content');
	const offcanvas = document.querySelector('.rishi-offcanvas-drawer');
	const offcanvasBodies = document.querySelectorAll('.rishi-drawer-inner'); 
	const offcanvasToggles = [...new Set([
		...document.querySelectorAll('[href="#rishi-offcanvas"]'),
		...document.querySelectorAll('[aria-controls="rishi-offcanvas"]')
	])]

	if(!offcanvas) return;
	const firstFocus = offcanvas.querySelector('[aria-controls="rishi-offcanvas"]');

	let returnFocus;

	let isOffcanvasOpen;
	let isOffcanvasOpening;

	function resetOffcanvas() {
		offcanvas.setAttribute('aria-hidden', 'true');
		isOffcanvasOpen = false;
		isOffcanvasOpening = false;
	}

	resetOffcanvas();

	document.body.addEventListener('focus', e => {
		if (isOffcanvasOpen && !e.target.closest('.rishi-drawer-wrapper')) {
			firstFocus.focus()
		}
	}, { capture: true }
	)

	document.addEventListener('keydown', e => {
		if (isOffcanvasOpen && e.key === 'Escape') {
			closeOffcanvas();
		}
	}
	)

	document.addEventListener('click', e => {
		if (isOffcanvasOpen && e.target === offcanvas) {
			closeOffcanvas();
		}
	})

	offcanvasToggles.forEach(toggle => {
		toggle.setAttribute('aria-controls', 'rishi-offcanvas');
		function handleToggle(e) {
			e.preventDefault();
			if (!isOffcanvasOpening) {
				isOffcanvasOpen ? closeOffcanvas() : openOffcanvas();
			}
		};

		toggle.addEventListener('click', handleToggle);
		if (toggle.hasAttribute('href')) {
			toggle.addEventListener('keydown', e => {
				if (e.key === 'Enter' || e.key === ' ') {
					handleToggle(e);
				}
			})
		}
	})

	function openOffcanvas() {
		isOffcanvasOpen = true;
		returnFocus = document.activeElement;
		window.requestAnimationFrame(() => {
			offcanvasToggles.forEach(toggle => {
				toggle.setAttribute('aria-expanded', 'true');
			});
			setStyle(document.body, { overflow: 'hidden' })
			setStyle(site, { 'pointer-events': 'none' })
			offcanvas.setAttribute('aria-hidden', 'false')
		})
	}

	function closeOffcanvas() {
		isOffcanvasOpen = false;
		window.requestAnimationFrame(() => {
			offcanvasToggles.forEach(toggle => {
				toggle.setAttribute('aria-expanded', 'false');
			});
			setStyle(document.body, { overflow: false })
			setStyle(site, { 'pointer-events': false })
			offcanvas.setAttribute('aria-hidden', 'true')
			returnFocus.focus();
		})
	}

	offcanvasBodies.forEach(offcanvasBody => {
		offcanvasBody.addEventListener('click', e => {
			if(offcanvas.getAttribute('aria-hidden') === 'true') return;
	
			const toggleBtn = e.target.closest('.submenu-toggle')
			if( toggleBtn) {
				e.preventDefault()
				e.stopPropagation()
				submenuToggle(toggleBtn.closest('.menu-item-has-children'))
			}
		})
	})
}

export default offcanvasToggle;