(function () { function iniciar() { const outer = document.querySelector(".carrusel-portafolio"); const container = outer ? outer.querySelector(".swiper") : null; if (!container || !container.swiper || !container.swiper.initialized) { setTimeout(iniciar, 50); return; } const wrapper = container.querySelector(".swiper-wrapper"); // Recolectamos todas las imágenes de fondo de las cards const imgs = [...wrapper.querySelectorAll(".contenedor-project")] .map((el) => getComputedStyle(el).backgroundImage) .filter((bg) => bg && bg !== "none") .map((bg) => bg.slice(5, -2).replace(/["']/g, "")); let cargadas = 0; function marcarListoSiTodoCargo() { cargadas++; if (cargadas >= imgs.length) { outer.classList.add("carrusel-listo"); // recién aquí se habilita el zoom por CSS empezarMedicion(); } } if (imgs.length === 0) { outer.classList.add("carrusel-listo"); empezarMedicion(); } else { imgs.forEach((src) => { const im = new Image(); im.onload = marcarListoSiTodoCargo; im.onerror = marcarListoSiTodoCargo; // no bloquear si una falla im.src = src; }); } function empezarMedicion() { let current = null; function actualizarCentro() { const outerRect = outer.getBoundingClientRect(); const wrapperRect = wrapper.getBoundingClientRect(); const centroVisible = outerRect.left + outerRect.width / 2; const slides = wrapper.querySelectorAll(".swiper-slide"); let masCercana = null; let distanciaMinima = Infinity; slides.forEach((slide) => { const centroSlide = wrapperRect.left + slide.offsetLeft + slide.offsetWidth / 2; const distancia = Math.abs(centroSlide - centroVisible); if (distancia < distanciaMinima) { distanciaMinima = distancia; masCercana = slide; } }); if (masCercana !== current) { if (current) current.classList.remove("is-center"); masCercana.classList.add("is-center"); current = masCercana; } requestAnimationFrame(actualizarCentro); } requestAnimationFrame(actualizarCentro); } } if (document.readyState === "complete") { iniciar(); } else { window.addEventListener("load", iniciar); setTimeout(iniciar, 200); } })();