import { t } from '../i18n.js'; /** * help_modal.js - Advanced Tabbed Markdown Guide. * Uses marked.js for high-fidelity rendering. */ export async function showHelpModal() { const modalContainer = document.getElementById('modal-container'); if (!modalContainer) return; const existing = document.getElementById('help-modal'); if (existing) existing.remove(); const overlay = document.createElement('div'); overlay.id = 'help-modal'; overlay.className = 'modal-overlay animate-fade-in active'; overlay.innerHTML = ` `; modalContainer.appendChild(overlay); const tabsBar = overlay.querySelector('#help-tabs'); const contentArea = overlay.querySelector('#help-modal-body'); async function loadTabContent(fileId, tabElement) { // Update tab styles tabsBar.querySelectorAll('.help-tab').forEach(t => { t.style.borderBottom = '2px solid transparent'; t.style.color = 'var(--sub-text)'; t.style.background = 'transparent'; }); tabElement.style.borderBottom = '2px solid var(--accent-color)'; tabElement.style.color = 'var(--accent-color)'; tabElement.style.background = 'rgba(59, 130, 246, 0.05)'; contentArea.innerHTML = `
Loading ${fileId}...
`; try { const response = await fetch(`/manual/${fileId}`); if (!response.ok) throw new Error('File not found'); let markdown = await response.text(); // Image Path Pre-processing: Fix relative paths for marked.js markdown = markdown.replace(/!\[(.*?)\]\((.*?)\)/g, (match, alt, src) => { const finalSrc = (src.startsWith('http') || src.startsWith('/')) ? src : `/manual/${src}`; return `![${alt}](${finalSrc})`; }); // Use marked library const htmlContent = window.marked.parse(markdown); contentArea.innerHTML = `
${htmlContent}
`; contentArea.scrollTop = 0; } catch (err) { contentArea.innerHTML = `
Error: ${err.message}
`; } } // Load Help File List try { const response = await fetch('/api/help/list'); const helpFiles = await response.json(); tabsBar.innerHTML = ''; // Clear "Initializing" helpFiles.forEach((file, index) => { const tab = document.createElement('div'); tab.className = 'help-tab'; tab.dataset.id = file.id; tab.innerText = file.title; tab.style.cssText = ` padding: 14px 20px; cursor: pointer; font-size: 13px; font-weight: 700; color: var(--sub-text); border-bottom: 2px solid transparent; white-space: nowrap; transition: all 0.2s; `; tab.addEventListener('mouseenter', () => { if (tab.style.borderBottomColor === 'transparent') { tab.style.color = 'var(--text-color)'; } }); tab.addEventListener('mouseleave', () => { if (tab.style.borderBottomColor === 'transparent') { tab.style.color = 'var(--sub-text)'; } }); tab.onclick = () => loadTabContent(file.id, tab); tabsBar.appendChild(tab); // Auto-load first tab if (index === 0) loadTabContent(file.id, tab); }); } catch (err) { tabsBar.innerHTML = `
Failed to load help list.
`; } const closeModal = () => { overlay.classList.replace('animate-fade-in', 'animate-fade-out'); overlay.querySelector('.modal-content').classList.replace('animate-scale-up', 'animate-scale-down'); setTimeout(() => overlay.remove(), 200); }; overlay.querySelector('#close-help').onclick = closeModal; overlay.querySelector('#help-confirm').onclick = closeModal; overlay.onclick = (e) => { if (e.target === overlay) closeModal(); }; }