Skip to content
Home
About Us
Services
Contact
ES
EN
Get a Quote
Home
About Us
Services
Contact
Get a Quote
(() => { const header = document.getElementById("imagine-site-header"); if (!header || header.dataset.initialized === "true") return; header.dataset.initialized = "true"; const button = header.querySelector(".is-header__menu-button"); const mobileMenu = header.querySelector(".is-header__mobile-menu"); const desktopNav = header.querySelector(".is-header__nav--desktop"); const navIndicator = header.querySelector(".is-header__nav-indicator"); const mainLinks = Array.from(header.querySelectorAll(".is-header__nav-link")); const languageSelector = header.querySelector(".is-header__languages"); const languageIndicator = header.querySelector(".is-header__language-indicator"); const languageLinks = Array.from(header.querySelectorAll(".is-header__language")); const moveIndicator = (container, target, xVariable, widthVariable) => { if (!container || !target) return; container.style.setProperty(xVariable, `${target.offsetLeft}px`); container.style.setProperty(widthVariable, `${target.offsetWidth}px`); }; const moveNavIndicator = (target) => { if (!desktopNav || !target) return; const indicatorWidth = 122; const centeredPosition = target.offsetLeft + (target.offsetWidth - indicatorWidth) / 2; const indicatorEdgeGap = 5; const maximumPosition = desktopNav.clientWidth - indicatorWidth - indicatorEdgeGap; const safePosition = Math.min( Math.max(centeredPosition, indicatorEdgeGap), maximumPosition ); desktopNav.style.setProperty( "--is-nav-indicator-x", `${safePosition}px` ); desktopNav.style.setProperty( "--is-nav-indicator-width", `${indicatorWidth}px` ); }; const setMainActive = (pageKey) => { const normalizedPage = pageKey || "home"; mainLinks.forEach((link) => { const isSelected = link.dataset.page === normalizedPage; link.classList.toggle("is-active", isSelected); if (isSelected) { link.setAttribute("aria-current", "page"); } else { link.removeAttribute("aria-current"); } }); const desktopTarget = mainLinks.find( (link) => link.closest(".is-header__nav--desktop") && link.dataset.page === normalizedPage ); moveNavIndicator(desktopTarget); }; const getCurrentPage = () => { const pathSegments = window.location.pathname .split("/") .filter(Boolean) .map((segment) => segment.toLowerCase()); /* * Permite que a mesma lógica funcione também em URLs como * /es/about/, /es/services/ e /es/contact/. */ if (pathSegments[0] === "es" || pathSegments[0] === "en") { pathSegments.shift(); } const currentSegment = pathSegments[0] || "home"; const knownPages = new Set(["about", "services", "contact"]); return knownPages.has(currentSegment) ? currentSegment : "home"; }; const setLanguageActive = (languageCode) => { const normalizedCode = String(languageCode || "EN").toUpperCase(); languageLinks.forEach((link) => { const isSelected = link.textContent.trim().toUpperCase() === normalizedCode; link.classList.toggle("is-active", isSelected); if (isSelected) { link.setAttribute("aria-current", "true"); } else { link.removeAttribute("aria-current"); } }); const languageTarget = languageLinks.find( (link) => link.textContent.trim().toUpperCase() === normalizedCode ); moveIndicator( languageSelector, languageTarget, "--is-language-indicator-x", "--is-language-indicator-width" ); }; const refreshIndicators = () => { const activeDesktopLink = header.querySelector( ".is-header__nav--desktop .is-header__nav-link.is-active" ); const activeLanguage = header.querySelector( ".is-header__language.is-active" ); moveNavIndicator(activeDesktopLink); moveIndicator( languageSelector, activeLanguage, "--is-language-indicator-x", "--is-language-indicator-width" ); }; const firstPathSegment = window.location.pathname .split("/") .filter(Boolean)[0] ?.toLowerCase(); const initialLanguage = firstPathSegment === "es" ? "ES" : ( header.querySelector(".is-header__language.is-active")?.textContent.trim() || "EN" ); setMainActive(getCurrentPage()); setLanguageActive(initialLanguage); mainLinks.forEach((link) => { link.addEventListener("click", () => { setMainActive(link.dataset.page); }); }); languageLinks.forEach((link) => { link.addEventListener("click", (event) => { const languageCode = link.textContent.trim(); const isPlainLeftClick = event.button === 0 && !event.metaKey && !event.ctrlKey && !event.shiftKey && !event.altKey; setLanguageActive(languageCode); if ( isPlainLeftClick && link.href && link.href !== window.location.href ) { event.preventDefault(); window.setTimeout(() => { window.location.assign(link.href); }, 320); } }); }); const closeMenu = () => { if (!button || !mobileMenu) return; header.classList.remove("is-menu-open"); button.setAttribute("aria-expanded", "false"); button.setAttribute("aria-label", "Open menu"); mobileMenu.setAttribute("aria-hidden", "true"); }; if (button && mobileMenu) { button.addEventListener("click", () => { const willOpen = !header.classList.contains("is-menu-open"); header.classList.toggle("is-menu-open", willOpen); button.setAttribute("aria-expanded", String(willOpen)); button.setAttribute("aria-label", willOpen ? "Close menu" : "Open menu"); mobileMenu.setAttribute("aria-hidden", String(!willOpen)); }); mobileMenu.querySelectorAll("a").forEach((link) => { link.addEventListener("click", closeMenu); }); } document.addEventListener("click", (event) => { if (!header.contains(event.target)) closeMenu(); }); document.addEventListener("keydown", (event) => { if (event.key === "Escape") closeMenu(); }); window.addEventListener("resize", () => { if (window.innerWidth > 1100) closeMenu(); window.requestAnimationFrame(refreshIndicators); }); window.addEventListener("popstate", () => { setMainActive(getCurrentPage()); }); window.requestAnimationFrame(refreshIndicators); if (document.fonts?.ready) { document.fonts.ready.then(refreshIndicators); } })();
Author:
hg1y4
Hello world!
Welcome to WordPress. This is your first post. Edit or delete it, then start writing!