(function () { const gallery = document.querySelector('#osvanScrollGallery'); if (!gallery) return; const slides = Array.from(gallery.querySelectorAll('.osvan-slide')); if (!slides.length) return; let ticking = false; let loopTimeout = null; let isLooping = false; function isOnInicio() { return window.location.hash === '' || window.location.hash === '#inicio'; } function isGalleryVisible() { const rect = gallery.getBoundingClientRect(); return rect.width > 0 && rect.height > 0; } function activateSlide(slideToActivate) { slides.forEach((slide) => slide.classList.remove('is-active')); if (slideToActivate) slideToActivate.classList.add('is-active'); } function loopToStart() { if (!isOnInicio() || !isGalleryVisible()) return; isLooping = true; gallery.scrollTo({ top: 0, behavior: 'auto' }); activateSlide(slides[0]); setTimeout(function () { isLooping = false; }, 150); } function setActiveSlide() { if (!isOnInicio() || !isGalleryVisible()) { ticking = false; return; } if (isLooping) { ticking = false; return; } if (gallery.scrollTop < 40) { activateSlide(slides[0]); ticking = false; return; } const galleryRect = gallery.getBoundingClientRect(); const galleryCenter = galleryRect.top + galleryRect.height / 2; let closestSlide = null; let closestDistance = Infinity; slides.forEach((slide) => { const image = slide.querySelector('img'); if (!image) return; const imageRect = image.getBoundingClientRect(); const imageCenter = imageRect.top + imageRect.height / 2; const distance = Math.abs(galleryCenter - imageCenter); if (distance < closestDistance) { closestDistance = distance; closestSlide = slide; } }); activateSlide(closestSlide); const lastSlide = slides[slides.length - 1]; const nearBottom = gallery.scrollTop + gallery.clientHeight >= gallery.scrollHeight - 20; if (closestSlide === lastSlide && nearBottom) { if (!loopTimeout) { loopTimeout = setTimeout(function () { loopTimeout = null; loopToStart(); }, 900); } } else { if (loopTimeout) { clearTimeout(loopTimeout); loopTimeout = null; } } ticking = false; } function onScroll() { if (!ticking) { window.requestAnimationFrame(setActiveSlide); ticking = true; } } gallery.addEventListener('scroll', onScroll, { passive: true }); window.addEventListener('resize', setActiveSlide); window.addEventListener('hashchange', function () { if (loopTimeout) { clearTimeout(loopTimeout); loopTimeout = null; } if (isOnInicio()) { setTimeout(setActiveSlide, 150); } }); slides.forEach((slide) => { const image = slide.querySelector('img'); if (image) { image.addEventListener('load', setActiveSlide); } }); activateSlide(slides[0]); setTimeout(setActiveSlide, 100); setTimeout(setActiveSlide, 500); })();

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

Hola, soy Oscar Rodríguez,
fotógrafo y fundador de OSVAN.
Soy fotógrafo en Bogotá, Colombia, enfocado en bodas, retratos y fotografía editorial con una mirada documental. Mi 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 documento bodas y proyectos editoriales desde una sensibilidad visual cercana al cine, la fotografía de calle y el retrato documental. Trabajo con equipos ligeros, adaptándome a cada espacio y dejando que la historia guíe la imagen.