import React, { useState, useEffect, useRef } from 'react'; import { Link, useLocation } from 'react-router-dom'; import { Home, Hash, FileSpreadsheet, Wand2, GitCompare, Menu, X, LinkIcon, Code2, ChevronDown, Type, Edit3 } from 'lucide-react'; import ThemeToggle from './ThemeToggle'; import ToolSidebar from './ToolSidebar'; const Layout = ({ children }) => { const location = useLocation(); const [isDropdownOpen, setIsDropdownOpen] = useState(false); const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false); const dropdownRef = useRef(null); const isActive = (path) => { return location.pathname === path; }; // Close dropdown when clicking outside useEffect(() => { const handleClickOutside = (event) => { if (dropdownRef.current && !dropdownRef.current.contains(event.target)) { setIsDropdownOpen(false); } }; document.addEventListener('mousedown', handleClickOutside); return () => { document.removeEventListener('mousedown', handleClickOutside); }; }, []); // Close mobile menu when route changes useEffect(() => { setIsMobileMenuOpen(false); setIsDropdownOpen(false); }, [location.pathname]); const tools = [ { path: '/object-editor', name: 'Object Editor', icon: Edit3, description: 'Visual editor for JSON & PHP objects' }, { path: '/url', name: 'URL Tool', icon: LinkIcon, description: 'URL encode/decode' }, { path: '/base64', name: 'Base64 Tool', icon: Hash, description: 'Base64 encode/decode' }, { path: '/csv-json', name: 'CSV/JSON Tool', icon: FileSpreadsheet, description: 'Convert CSV ↔ JSON' }, { path: '/beautifier', name: 'Beautifier Tool', icon: Wand2, description: 'Beautify/minify code' }, { path: '/diff', name: 'Diff Tool', icon: GitCompare, description: 'Compare text differences' }, { path: '/text-length', name: 'Text Length Checker', icon: Type, description: 'Analyze text length & stats' }, ]; // Check if we're on a tool page (not homepage) const isToolPage = location.pathname !== '/'; return (
{/* Header */}
DevTools
{/* Desktop Navigation - only show on homepage */} {!isToolPage && ( )} {/* Mobile Menu Button */}
{/* Mobile Navigation Menu */} {isMobileMenuOpen && (
setIsMobileMenuOpen(false)} className={`flex items-center space-x-3 px-3 py-2 rounded-md text-sm font-medium transition-colors ${ isActive('/') ? 'bg-primary-100 text-primary-700 dark:bg-primary-900 dark:text-primary-300' : 'text-gray-600 hover:text-gray-900 dark:text-gray-300 dark:hover:text-white' }`} > Home
{isToolPage ? 'Switch Tools' : 'Tools'}
{tools.map((tool) => { const IconComponent = tool.icon; return ( setIsMobileMenuOpen(false)} className={`flex items-center space-x-3 px-3 py-2 rounded-md text-sm font-medium transition-colors ${ isActive(tool.path) ? 'bg-primary-100 text-primary-700 dark:bg-primary-900 dark:text-primary-300' : 'text-gray-600 hover:text-gray-900 dark:text-gray-300 dark:hover:text-white' }`} >
{tool.name}
{tool.description}
); })}
)} {/* Main Content */}
{/* Tool Sidebar - only show on tool pages */} {isToolPage && (
)} {/* Main Content Area */}
{isToolPage ? (
{children}
{/* Footer for tool pages - inside scrollable content */}

© {new Date().getFullYear()} Dewe Toolsites - Developer Tools.

) : (
{children}
{/* Footer for homepage */}
)}
); }; export default Layout;