window.addEventListener('load', function () { const gallery = document.querySelector('#osvanScrollGallery'); if (!gallery) return; const originalSlides = Array.from(gallery.querySelectorAll('.osvan-slide')); if (!originalSlides.length) return; originalSlides.forEach(function (slide) { const clone = slide.cloneNode(true); clone.classList.add('osvan-clone'); clone.setAttribute('aria-hidden', 'true'); gallery.appendChild(clone); }); const slides = Array.from(gallery.querySelectorAll('.osvan-slide')); let isPaused = false; let pauseTimeout = null; let ticking = false; let isResettingLoop = false; const SCROLL_AMOUNT = 1; const SCROLL_INTERVAL = 18; function isDesktop() { return window.matchMedia('(min-width: 900px)').matches; } function getCycleSize() { const firstClone = gallery.querySelector('.osvan-clone'); if (!firstClone) return 0; if (isDesktop()) { return firstClone.offsetLeft - originalSlides[0].offsetLeft; } return firstClone.offsetTop - originalSlides[0].offsetTop; } function activateSlide(slideToActivate) { slides.forEach(function (slide) { slide.classList.remove('is-active'); }); if (slideToActivate) { slideToActivate.classList.add('is-active'); } } function normalizeLoopPosition() { if (isResettingLoop) return; const cycleSize = getCycleSize(); if (cycleSize <= 0) return; if (isDesktop()) { if (gallery.scrollLeft >= cycleSize) { isResettingLoop = true; gallery.scrollLeft = gallery.scrollLeft - cycleSize; requestAnimationFrame(function () { isResettingLoop = false; setActiveSlide(); }); } } else { if (gallery.scrollTop >= cycleSize) { isResettingLoop = true; gallery.scrollTop = gallery.scrollTop - cycleSize; requestAnimationFrame(function () { isResettingLoop = false; setActiveSlide(); }); } } } function setActiveSlide() { const galleryRect = gallery.getBoundingClientRect(); let closestSlide = slides[0]; let closestDistance = Infinity; slides.forEach(function (slide) { const image = slide.querySelector('img'); if (!image) return; const imageRect = image.getBoundingClientRect(); let distance; if (isDesktop()) { const galleryCenterX = galleryRect.left + galleryRect.width / 2; const imageCenterX = imageRect.left + imageRect.width / 2; distance = Math.abs(galleryCenterX - imageCenterX); } else { const mobileFocusY = galleryRect.top + galleryRect.height * 0.28; const imageCenterY = imageRect.top + imageRect.height / 2; distance = Math.abs(mobileFocusY - imageCenterY); } if (distance < closestDistance) { closestDistance = distance; closestSlide = slide; } }); activateSlide(closestSlide); ticking = false; } function requestActiveUpdate() { if (!ticking) { window.requestAnimationFrame(function () { normalizeLoopPosition(); setActiveSlide(); }); ticking = true; } } function autoScroll() { if (isPaused) return; if (isDesktop()) { gallery.scrollLeft += SCROLL_AMOUNT; } else { gallery.scrollTop += SCROLL_AMOUNT; } normalizeLoopPosition(); requestActiveUpdate(); } function pauseAutoScroll() { isPaused = true; if (pauseTimeout) { clearTimeout(pauseTimeout); } pauseTimeout = setTimeout(function () { isPaused = false; }, 5000); } gallery.addEventListener('scroll', function () { if (!isResettingLoop) { normalizeLoopPosition(); requestActiveUpdate(); } }, { passive: true }); gallery.addEventListener('wheel', function (event) { pauseAutoScroll(); if (isDesktop()) { gallery.scrollLeft += event.deltaY; normalizeLoopPosition(); event.preventDefault(); requestActiveUpdate(); } }, { passive: false }); gallery.addEventListener('touchstart', pauseAutoScroll, { passive: true }); gallery.addEventListener('mousedown', pauseAutoScroll); window.addEventListener('resize', function () { gallery.scrollTop = 0; gallery.scrollLeft = 0; activateSlide(slides[0]); setTimeout(setActiveSlide, 300); }); activateSlide(slides[0]); setTimeout(setActiveSlide, 300); setTimeout(setActiveSlide, 800); setInterval(autoScroll, SCROLL_INTERVAL); });



Cada historia empieza con una conversación.Si estás planeando una boda, una sesión editorial o un proyecto visual, escríbenos para consultar disponibilidad y contarme un poco sobre lo que tienes en mente.


Hola, somos Oscar y Vanessa, fotógrafos y creadores de OSVAN.Somos fotógrafo en Bogotá, Colombia, enfocado en bodas, retratos y fotografía editorial con una mirada documental. Nuestro trabajo nace de observar los momentos reales: los gestos pequeños, la luz natural, la emoción espontánea y todo lo que ocurre cuando las personas se sienten presentes.En OSVAN documentamos bodas y proyectos editoriales desde una sensibilidad visual cercana al cine, la fotografía de calle y el retrato documental.