document.addEventListener('DOMContentLoaded', () => { // --- Mobile Menu Toggle --- const menuToggle = document.querySelector('.menu-toggle'); const navLinks = document.querySelector('.nav-links'); if (menuToggle && navLinks) { menuToggle.addEventListener('click', () => { navLinks.classList.toggle('mobile-open'); const icon = menuToggle.querySelector('i'); if (icon) { icon.classList.toggle('fa-bars'); icon.classList.toggle('fa-xmark'); } }); } // --- Tablet Mockup Interactive Demo --- const captureBtn = document.getElementById('demo-capture-btn'); const screenWelcome = document.getElementById('demo-screen-welcome'); const screenCountdown = document.getElementById('demo-screen-countdown'); const screenPreview = document.getElementById('demo-screen-preview'); const timerDisplay = document.getElementById('demo-timer'); const flashOverlay = document.getElementById('demo-flash'); const btnPrint = document.getElementById('demo-btn-print'); const btnReset = document.getElementById('demo-btn-reset'); if (captureBtn && screenWelcome && screenCountdown && screenPreview && timerDisplay && flashOverlay) { captureBtn.addEventListener('click', () => { // Step 1: Switch screen to countdown screenWelcome.style.display = 'none'; screenCountdown.style.display = 'flex'; // Step 2: 3-second countdown countdown let timeLeft = 3; timerDisplay.textContent = timeLeft; const timerInterval = setInterval(() => { timeLeft--; if (timeLeft > 0) { timerDisplay.textContent = timeLeft; } else { clearInterval(timerInterval); // Step 3: Trigger Camera Flash overlay flashOverlay.classList.add('flash-active'); setTimeout(() => { flashOverlay.classList.remove('flash-active'); // Step 4: Transition to captured photo preview screen screenCountdown.style.display = 'none'; screenPreview.style.display = 'flex'; }, 400); } }, 800); }); } if (btnReset && screenWelcome && screenPreview) { btnReset.addEventListener('click', () => { screenPreview.style.display = 'none'; screenWelcome.style.display = 'flex'; }); } // --- Accordion FAQ --- const accordionHeaders = document.querySelectorAll('.accordion-header'); accordionHeaders.forEach(header => { header.addEventListener('click', () => { const item = header.parentElement; const isActive = item.classList.contains('active'); // Close all items document.querySelectorAll('.accordion-item').forEach(i => { i.classList.remove('active'); const content = i.querySelector('.accordion-content'); if (content) content.style.maxHeight = null; }); // Toggle active item if (!isActive) { item.classList.add('active'); const content = item.querySelector('.accordion-content'); if (content) { content.style.maxHeight = content.scrollHeight + "px"; } } }); }); // --- Feedback Hub Logic --- const feedbackForm = document.getElementById('feedback-form'); const feedbackList = document.getElementById('feedback-list'); const filterButtons = document.querySelectorAll('.filter-btn'); let feedbackData = []; // Upvote storage track (local to session/device) let upvotedIds = JSON.parse(localStorage.getItem('schnappix_upvoted_ids')) || []; const saveUpvotesToLocal = () => { localStorage.setItem('schnappix_upvoted_ids', JSON.stringify(upvotedIds)); }; // Admin State let isAdmin = sessionStorage.getItem('schnappix_is_admin') === 'true'; const loadFeedback = async () => { if (!feedbackList) return; try { const response = await fetch('feedback_backend.php?action=get'); const result = await response.json(); if (result.success) { feedbackData = result.data; renderFeedback(getActiveFilter()); } } catch (error) { console.error('Error loading feedback:', error); } }; const renderFeedback = (filter = 'all') => { if (!feedbackList) return; feedbackList.innerHTML = ''; // Sort by upvotes descending const sortedData = [...feedbackData].sort((a, b) => b.upvotes - a.upvotes); sortedData.forEach(item => { if (filter !== 'all' && item.type !== filter) return; const isVoted = upvotedIds.includes(item.id); const card = document.createElement('div'); card.className = 'feedback-item glass'; let badgeIcon = 'âš'; let categoryLabel = 'Feature'; if (item.type === 'bug') { badgeIcon = 'đ'; categoryLabel = 'Bug'; } else if (item.type === 'love') { badgeIcon = 'đ'; categoryLabel = 'Lob'; } // Show admin actions if user is admin let adminActionsHtml = ''; if (isAdmin) { adminActionsHtml = `
${escapeHtml(item.answer)}
${escapeHtml(item.text)}
${answerHtml}