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'); } }); } // --- 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'); // Default Seed Data const defaultFeedback = [ { id: 'fb-1', author: 'Markus T.', type: 'feature', title: 'QR-Code Download für Gäste', text: 'Es wäre super cool, wenn nach der Aufnahme ein QR-Code angezeigt wird, über den sich die Gäste das Foto direkt auf das Handy laden können.', upvotes: 42, voted: false }, { id: 'fb-2', author: 'Sabrina', type: 'love', title: 'Sticker-Editor ist genial!', text: 'Unsere Hochzeitsgäste haben stundenlang Emojis und Eventtexte verschoben. Die Bedienung ist wirklich super intuitiv und einfach.', upvotes: 28, voted: false }, { id: 'fb-3', author: 'EventTech GmbH', type: 'bug', title: 'Drucker-Timeout bei schlechtem WLAN', text: 'Manchmal meldet die App einen Fehler, wenn der Drucker im lokalen Netzwerk kurz die Verbindung verliert. Ein automatischer Retry wäre hilfreich.', upvotes: 15, voted: false } ]; // Load from LocalStorage or seed defaults let feedbackData = JSON.parse(localStorage.getItem('schnappix_feedback')); if (!feedbackData) { feedbackData = defaultFeedback; localStorage.setItem('schnappix_feedback', JSON.stringify(feedbackData)); } // Upvote storage track (local to session/device) let upvotedIds = JSON.parse(localStorage.getItem('schnappix_upvoted_ids')) || []; const saveToLocalStorage = () => { localStorage.setItem('schnappix_feedback', JSON.stringify(feedbackData)); localStorage.setItem('schnappix_upvoted_ids', JSON.stringify(upvotedIds)); }; 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'; } card.innerHTML = `
${escapeHtml(item.text)}