"use client"; import { usePathname } from "next/navigation"; import { useState, useEffect } from "react"; import Link from "next/link"; import { useTheme } from "next-themes"; import { createPortal } from "react-dom"; import { Home, Info, BookOpen, Cpu, SlidersHorizontal, Terminal, Scale, ShoppingBag, Menu, X, Sun, Moon } from "lucide-react"; export default function Header() { const [drawerOpen, setDrawerOpen] = useState(false); const [mounted, setMounted] = useState(false); const pathname = usePathname(); useEffect(() => { setMounted(true); }, []); const menuItems = [ { text: "Início", href: "/", icon: , featured: true }, { text: "Sobre o Projeto", brief: "Sobre", href: "/sobre", icon: }, { text: "Glossário", href: "/glossario", icon: }, { text: "Séries", href: "/series", icon: , featured: true }, { text: "Seletor de ESP32", brief: "Seletor", href: "/seletor", icon: , featured: true }, { text: "Frameworks", href: "/frameworks", icon: , featured: true }, { text: "Comparar Séries", brief: "Comparar", href: "/comparacao", icon: , featured: true }, { text: "Catálogo de Placas", brief: "Catálogo", href: "/catalogo", icon: }, ]; const featuredItems = menuItems.filter(item => item.featured); function isActive(href) { if (href === "/") { return pathname === "/"; } return String(pathname).includes(href) && href !== "/"; } // Lock scroll when mobile menu is open useEffect(() => { if (drawerOpen) { document.body.style.overflow = "hidden"; } else { document.body.style.overflow = ""; } return () => { document.body.style.overflow = ""; }; }, [drawerOpen]); return (
{/* LOGO */} {/* eslint-disable-next-line @next/next/no-img-element */}

ESPDocs

{/* Menu Desktop */} {/* Botões Mobile (Theme + Burger) */}
{/* Render side-panel and overlay at body level via React Portal to prevent layout leakage */} {mounted && createPortal( <> {drawerOpen && (
setDrawerOpen(false)} /> )}
{/* Drawer Header */}

Menu Navegação

{/* Drawer Menu Items */} {/* Drawer Footer Info */}

ESPDocs • Plataforma Não Oficial

, document.body )}
); } /* Internal ThemeToggle Component */ function ThemeToggle() { const { resolvedTheme, setTheme } = useTheme(); const [mounted, setMounted] = useState(false); useEffect(() => setMounted(true), []); if (!mounted) { return (
); } return ( ); }