/* Slide Deck 16:9 Controller */ (function () { const container = document.getElementById('slideContainer'); const slides = Array.from(container.querySelectorAll('.slide')); const prevBtn = document.getElementById('prevBtn'); const nextBtn = document.getElementById('nextBtn'); const dotsWrap = document.getElementById('dots'); const progressBar = document.getElementById('progressBar'); const themeToggle = document.getElementById('themeToggle'); const fullscreenBtn = document.getElementById('fullscreenBtn'); const replayBtn = document.getElementById('replayBtn'); const copyBtn = document.getElementById('copyCode'); const codeSample = document.getElementById('codeSample'); const state = { index: 0, total: slides.length }; // Build dots slides.forEach((_, i) => { const dot = document.createElement('button'); dot.className = 'dot' + (i === 0 ? ' is-active' : ''); dot.setAttribute('role', 'tab'); dot.setAttribute('aria-label', `Ir para slide ${i + 1}`); dot.addEventListener('click', () => goTo(i)); dotsWrap.appendChild(dot); }); const dots = Array.from(dotsWrap.querySelectorAll('.dot')); function updateUI() { slides.forEach((s, i) => s.classList.toggle('is-active', i === state.index)); dots.forEach((d, i) => d.classList.toggle('is-active', i === state.index)); prevBtn.disabled = state.index === 0; nextBtn.disabled = state.index === state.total - 1; progressBar.style.width = `${((state.index + 1) / state.total) * 100}%`; // Announce for a11y const activeSlide = slides[state.index]; activeSlide?.setAttribute('aria-label', `Slide ${state.index + 1} de ${state.total}`); } function next() { if (state.index < state.total - 1) { state.index++; updateUI(); } } function prev() { if (state.index > 0) { state.index--; updateUI(); } } function goTo(i) { state.index = Math.max(0, Math.min(state.total - 1, i)); updateUI(); } // Events nextBtn.addEventListener('click', next); prevBtn.addEventListener('click', prev); document.addEventListener('keydown', (e) => { if (e.key === 'ArrowRight' || e.key === 'PageDown') { e.preventDefault(); next(); } else if (e.key === 'ArrowLeft' || e.key === 'PageUp') { e.preventDefault(); prev(); } else if (e.key === 'Home') { e.preventDefault(); goTo(0); } else if (e.key === 'End') { e.preventDefault(); goTo(state.total - 1); } }); // Touch swipe let touchStartX = null; container.addEventListener('touchstart', (e) => { touchStartX = e.changedTouches[0].clientX; }, { passive: true }); container.addEventListener('touchend', (e) => { if (touchStartX === null) return; const dx = e.changedTouches[0].clientX - touchStartX; if (Math.abs(dx) > 40) { dx < 0 ? next() : prev(); } touchStartX = null; }, { passive: true }); // Theme toggle (undefined mode -> light by default) themeToggle.addEventListener('click', () => { const wrapper = document.querySelector('.theme-wrapper'); wrapper.classList.toggle('dark'); themeToggle.innerHTML = wrapper.classList.contains('dark') ? '' : ''; if (window.feather) feather.replace(); }); // Fullscreen function toggleFullscreen() { const elem = document.documentElement; if (!document.fullscreenElement) { (elem.requestFullscreen || elem.webkitRequestFullscreen || elem.msRequestFullscreen)?.call(elem); } else { (document.exitFullscreen || document.webkitExitFullscreen || document.msExitFullscreen)?.call(document); } } fullscreenBtn.addEventListener('click', toggleFullscreen); document.addEventListener('fullscreenchange', () => { fullscreenBtn.innerHTML = document.fullscreenElement ? '' : ''; if (window.feather) feather.replace(); }); // Replay / CTA shortcuts document.getElementById('startSlides')?.addEventListener('click', () => goTo(1)); document.getElementById('viewSamples')?.addEventListener('click', () => goTo(2)); document.getElementById('replayBtn')?.addEventListener('click', () => goTo(0)); document.getElementById('contactBtn')?.addEventListener('click', (e) => { e.preventDefault(); alert('Obrigado! Vamos conversarei em breve.'); }); // Copy code copyBtn?.addEventListener('click', async () => { try { await navigator.clipboard.writeText(codeSample?.textContent || ''); copyBtn.innerHTML = ''; if (window.feather) feather.replace(); setTimeout(() => { copyBtn.innerHTML = ''; if (window.feather) feather.replace(); }, 1200); } catch (_) {} }); // Init icons and UI if (window.feather) feather.replace(); updateUI(); })();