// vivants.js — LP Vivants · Bylevel · Junho 2026 window.addEventListener('DOMContentLoaded', function() { // nav scroll var nav = document.getElementById('nav'); if (nav) { window.addEventListener('scroll', function() { nav.classList.toggle('on', window.scrollY > 55); }, { passive: true }); } // reveal on scroll var obs = new IntersectionObserver(function(entries) { entries.forEach(function(e) { if (e.isIntersecting) { e.target.classList.add('in'); obs.unobserve(e.target); } }); }, { threshold: 0.1 }); document.querySelectorAll('.rv').forEach(function(el) { obs.observe(el); }); // faq accordion document.querySelectorAll('.fi__q').forEach(function(btn) { btn.addEventListener('click', function() { var fi = btn.closest('.fi'); var open = fi.classList.contains('open'); document.querySelectorAll('.fi.open').forEach(function(i) { i.classList.remove('open'); i.querySelector('.fi__q').setAttribute('aria-expanded', 'false'); }); if (!open) { fi.classList.add('open'); btn.setAttribute('aria-expanded', 'true'); } }); }); // depoimentos — carrossel simples sem loop (function() { var track = document.getElementById('depoTrack'); var dotsWrap = document.getElementById('depoDots'); var arrowPrev = document.getElementById('depoArrowPrev'); var arrowNext = document.getElementById('depoArrowNext'); if (!track) return; var cards = Array.from(track.querySelectorAll('.dcard:not(.dcard--clone)')); // remover clones que possam ter ficado de versões anteriores track.querySelectorAll('.dcard--clone').forEach(function(c) { c.remove(); }); var cardW = function() { return cards[0] ? cards[0].offsetWidth + 20 : 360; }; // dots if (dotsWrap) { dotsWrap.innerHTML = ''; cards.forEach(function(_, i) { var d = document.createElement('button'); d.className = 'depo__dot' + (i === 0 ? ' active' : ''); d.setAttribute('aria-label', 'Card ' + (i + 1)); d.addEventListener('click', function() { track.scrollTo({ left: i * cardW(), behavior: 'smooth' }); }); dotsWrap.appendChild(d); }); } // atualizar dots e setas function updateNav() { var dots = dotsWrap ? dotsWrap.querySelectorAll('.depo__dot') : []; var closest = 0, minDist = Infinity; cards.forEach(function(c, i) { var dist = Math.abs(c.getBoundingClientRect().left - track.getBoundingClientRect().left); if (dist < minDist) { minDist = dist; closest = i; } }); dots.forEach(function(d, i) { d.classList.toggle('active', i === closest); }); var atStart = track.scrollLeft < 10; var atEnd = track.scrollLeft >= track.scrollWidth - track.clientWidth - 10; if (arrowPrev) arrowPrev.classList.toggle('hidden', atStart); if (arrowNext) arrowNext.classList.toggle('hidden', atEnd); } track.addEventListener('scroll', updateNav, { passive: true }); updateNav(); // setas if (arrowPrev) { arrowPrev.addEventListener('click', function() { track.scrollBy({ left: -cardW(), behavior: 'smooth' }); }); } if (arrowNext) { arrowNext.addEventListener('click', function() { track.scrollBy({ left: cardW(), behavior: 'smooth' }); }); } // drag scroll var isDragging = false, startX = 0, scrollStart = 0; track.addEventListener('mousedown', function(e) { isDragging = true; startX = e.pageX; scrollStart = track.scrollLeft; track.classList.add('dragging'); }); window.addEventListener('mousemove', function(e) { if (!isDragging) return; e.preventDefault(); track.scrollLeft = scrollStart - (e.pageX - startX); }); window.addEventListener('mouseup', function() { if (!isDragging) return; isDragging = false; track.classList.remove('dragging'); }); // play lazy + controles nos cards de vídeo cards.forEach(function(card) { if (!card.classList.contains('dcard--video')) return; var video = card.querySelector('.dcard__video'); var playBtn = card.querySelector('.dcard__playpause'); var progress = card.querySelector('.dcard__progress'); var fill = card.querySelector('.dcard__progress-fill'); var volBtn = card.querySelector('.dcard__vol'); var iconPause = card.querySelector('.icon-pause'); var iconPlay = card.querySelector('.icon-play'); var iconVol = card.querySelector('.icon-vol'); var iconMuted = card.querySelector('.icon-muted'); var playOverlay = card.querySelector('.dcard__play'); if (playOverlay) { playOverlay.addEventListener('click', function() { document.querySelectorAll('.dcard--playing').forEach(function(c) { c.classList.remove('dcard--playing'); var v = c.querySelector('.dcard__video'); if (v) { v.pause(); v.src = ''; v.load(); } }); var src = card.dataset.src; if (!src || !video) return; video.src = src; video.load(); video.play().catch(function() {}); card.classList.add('dcard--playing'); }); } if (!video) return; if (playBtn) { playBtn.addEventListener('click', function(e) { e.stopPropagation(); if (video.paused) { video.play(); if (iconPause) iconPause.style.display = ''; if (iconPlay) iconPlay.style.display = 'none'; } else { video.pause(); if (iconPause) iconPause.style.display = 'none'; if (iconPlay) iconPlay.style.display = ''; } }); } if (fill) { video.addEventListener('timeupdate', function() { if (video.duration) fill.style.width = (video.currentTime / video.duration * 100) + '%'; }); } if (progress) { progress.addEventListener('click', function(e) { e.stopPropagation(); var rect = progress.getBoundingClientRect(); video.currentTime = ((e.clientX - rect.left) / rect.width) * video.duration; }); } if (volBtn) { volBtn.addEventListener('click', function(e) { e.stopPropagation(); video.muted = !video.muted; if (iconVol) iconVol.style.display = video.muted ? 'none' : ''; if (iconMuted) iconMuted.style.display = video.muted ? '' : 'none'; }); } }); })(); }); // fim DOMContentLoaded