/** * LocalTools - Main Application * Handles navigation, theme, and global features */ document.addEventListener('DOMContentLoaded', () => { initTheme(); initNavigation(); initMobileMenu(); initSetupNotice(); initPdfEditor(); initImageScraper(); initGlobalShortcuts(); initPdfTools(); initImageTools(); }); /** * Theme Management */ function initTheme() { const themeToggle = document.getElementById('themeToggle'); const savedTheme = localStorage.getItem('theme') || 'light'; document.documentElement.setAttribute('data-theme', savedTheme); themeToggle.addEventListener('click', () => { const currentTheme = document.documentElement.getAttribute('data-theme'); const newTheme = currentTheme === 'dark' ? 'light' : 'dark'; document.documentElement.setAttribute('data-theme', newTheme); localStorage.setItem('theme', newTheme); showToast( newTheme === 'dark' ? 'Dark Mode' : 'Light Mode', 'Theme updated', 'success', 2000 ); }); } /** * Setup Notice */ function initSetupNotice() { const notice = document.getElementById('setupNotice'); const closeBtn = document.getElementById('closeSetupNotice'); // Check if dismissed if (localStorage.getItem('setupNoticeDismissed')) { notice.classList.add('hidden'); } // Close button closeBtn.addEventListener('click', () => { notice.classList.add('hidden'); localStorage.setItem('setupNoticeDismissed', 'true'); }); // Copy buttons document.querySelectorAll('.copy-btn').forEach(btn => { btn.addEventListener('click', async () => { const text = btn.dataset.copy; try { await navigator.clipboard.writeText(text); btn.classList.add('copied'); showToast('Copied!', text, 'success', 2000); setTimeout(() => { btn.classList.remove('copied'); }, 2000); } catch (err) { showToast('Copy failed', 'Please copy manually', 'error'); } }); }); } /** * Sidebar Navigation */ function initNavigation() { const navItems = document.querySelectorAll('.nav-item[data-page]'); const pages = document.querySelectorAll('.page'); navItems.forEach(item => { item.addEventListener('click', () => { const targetPage = item.dataset.page; switchToPage(targetPage); // Close mobile menu closeMobileMenu(); }); }); } function switchToPage(pageName) { const navItems = document.querySelectorAll('.nav-item[data-page]'); const pages = document.querySelectorAll('.page'); navItems.forEach(item => { item.classList.toggle('active', item.dataset.page === pageName); }); pages.forEach(page => { page.classList.toggle('active', page.id === `page-${pageName}`); }); } /** * Mobile Menu */ function initMobileMenu() { const menuBtn = document.getElementById('mobileMenuBtn'); const sidebar = document.getElementById('sidebar'); const overlay = document.getElementById('sidebarOverlay'); menuBtn.addEventListener('click', () => { sidebar.classList.toggle('open'); overlay.classList.toggle('active'); }); overlay.addEventListener('click', closeMobileMenu); } function closeMobileMenu() { const sidebar = document.getElementById('sidebar'); const overlay = document.getElementById('sidebarOverlay'); sidebar.classList.remove('open'); overlay.classList.remove('active'); } /** * Global Keyboard Shortcuts */ function initGlobalShortcuts() { registerShortcut('1', () => switchToPage('pdf'), 'PDF Editor'); registerShortcut('2', () => switchToPage('watermark'), 'Watermark Remover'); registerShortcut('3', () => switchToPage('img2pdf'), 'Images to PDF'); registerShortcut('4', () => switchToPage('merge'), 'Merge PDFs'); registerShortcut('5', () => switchToPage('split'), 'Split PDF'); registerShortcut('6', () => switchToPage('images'), 'Image Scraper'); registerShortcut('ctrl+k', () => { document.getElementById('themeToggle').click(); }, 'Toggle Theme'); registerShortcut('?', () => { showKeyboardShortcutsModal(); }, 'Show Shortcuts'); // Nav button handlers document.getElementById('navRecentFiles').addEventListener('click', showRecentFilesModal); document.getElementById('navKeyboardShortcuts').addEventListener('click', showKeyboardShortcutsModal); // Initialize watermark removal page initWatermarkRemoval(); } /** * Recent Files Modal */ function showRecentFilesModal() { const recentFiles = JSON.parse(localStorage.getItem('recentFiles') || '[]'); let content = ''; if (recentFiles.length === 0) { content = `