import React, { useState, useEffect } from 'react'; import ReactDOM from 'react-dom'; import ReactMarkdown from 'react-markdown'; import remarkGfm from 'remark-gfm'; import * as LucideIcons from 'lucide-react'; import { X, Search, ChevronRight, BookOpen } from 'lucide-react'; import { useAppConfig } from '../contexts/AppConfigContext'; import { userGuideTopics } from '../data/userGuide'; import '../styles/UserGuide.css'; const UserGuide = () => { const { config, advisors } = useAppConfig(); const [isOpen, setIsOpen] = useState(false); const [activeId, setActiveId] = useState(userGuideTopics[0].id); const [search, setSearch] = useState(''); useEffect(() => { const open = () => setIsOpen(true); window.addEventListener('open-user-guide', open); return () => window.removeEventListener('open-user-guide', open); }, []); useEffect(() => { if (!isOpen) return; const onKey = (e) => e.key === 'Escape' && setIsOpen(false); window.addEventListener('keydown', onKey); return () => window.removeEventListener('keydown', onKey); }, [isOpen]); const appName = config?.app?.title || 'the app'; const advisorEntries = Object.values(advisors || {}); const advisorCount = advisorEntries.length; const advisorList = advisorEntries .map((a) => `- **${a.name}:** ${a.description || a.role || ''}`.trimEnd()) .join('\n'); const q = search.toLowerCase().trim(); const filteredTopics = q ? userGuideTopics.filter(t => t.title.toLowerCase().includes(q) || t.content.toLowerCase().includes(q)) : userGuideTopics; const activeTopic = userGuideTopics.find(t => t.id === activeId) || userGuideTopics[0]; if (!isOpen) return null; return ReactDOM.createPortal(