Líderes en Realidad

Virtual Aumentada

Creamos experiencias inmersivas

Líderes en Realidad Virtual
y Realidad Aumentada

ver
demo reel

nuestros servicios

Loading 3D Model: 0%

Realidad Virtual

videojuegos • metaverso • Rrcorridos virtuales • apps • filtros • fooh • instalaciones interactivas • videojuegos • metaverso • recorridos virtuales • apps • filtros • fooh • instalaciones interactivas •

experiencia

+500

proyectos
desarrollados

+15

años de
experiencia

+40

profesionales de
distintas disciplinas

30%

de proyectos
internacionales

desarrollamos proyectos inmersivos a nivel global

desarrollamos proyectos inmersivos a nivel global

¡trabajemos
juntos!

document.addEventListener("DOMContentLoaded", () => { gsap.registerPlugin(ScrollTrigger); const lenis = new Lenis({ duration: 1.2, easing: (t) => Math.min(1, 1.001 - Math.pow(2, -10 * t)), direction: "vertical", smooth: true, smoothTouch: false, infinite: false, }); window.lenis = lenis; let lastScrollY = 0; let isMenuVisible = true; let isAnimating = false; const menu = document.getElementById("menu"); const bgMenu = document.getElementById("bg-menu"); if (!menu || !bgMenu) { console.warn("No se encontraron #menu o #bg-menu en esta pagina."); return; } function handleScroll(e) { if (isAnimating) return; isAnimating = true; const currentScrollY = e.scroll; if (Math.abs(currentScrollY - lastScrollY) lastScrollY + 5 && isMenuVisible) { gsap.to(menu, { y: "-100%", duration: 0.3, ease: "power2.out" }); isMenuVisible = false; } else if (currentScrollY { isAnimating = false; }); } lenis.on("scroll", handleScroll); gsap.to("#bg-menu", { opacity: 1, duration: 0.2, ease: "power4.out", scrollTrigger: { trigger: "body", start: "100px top", toggleActions: "play reverse play reverse", markers: false } }); function raf(time) { lenis.raf(time); requestAnimationFrame(raf); } requestAnimationFrame(raf); }); document.addEventListener("DOMContentLoaded", function () { const menuBtn = document.querySelector('.menu-toggle'); const menuCircle = document.querySelector('.side-menu-circle'); const menuItems = document.querySelectorAll('.menu-circular .elementor-item'); if (!menuBtn || !menuCircle || menuItems.length === 0) { console.error("Faltan elementos."); return; } gsap.set(menuCircle, { clipPath: "circle(0% at 100% 0%)" }); gsap.set(menuItems, { opacity: 0, x: 30 }); let isOpen = false; let isAnimating = false; function openMenu() { const tl = gsap.timeline(); tl.to(menuCircle, { clipPath: "circle(145% at 100% 0%)", duration: 1, ease: "power2.out" }) .to(menuItems, { opacity: 1, x: 0, stagger: 0.1, duration: 0.5, ease: "power2.out" }, "-=1.3"); } function closeMenu() { const tl = gsap.timeline(); tl.to(menuItems, { opacity: 0, x: 30, stagger: 0.1, duration: 0.1, ease: "power4.in" }) .to(menuCircle, { clipPath: "circle(0% at 100% 0%)", duration: 0.8, ease: "power2.out" }, "-=1"); } menuBtn.addEventListener('click', () => { if (isAnimating) return; isAnimating = true; isOpen = !isOpen; menuBtn.classList.toggle("open"); if (isOpen) { openMenu(); } else { closeMenu(); } setTimeout(() => { isAnimating = false; }, 1000); }); });