"use client"; import { usePathname } from "next/navigation"; import { useState, useEffect, useRef } 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, AlertTriangle, Menu, X, Sun, Moon, ChevronDown, Sparkles, ArrowRight, ExternalLink, Compass, Layers } from "lucide-react"; export default function Header() { const [drawerOpen, setDrawerOpen] = useState(false); const [hardwareDropdown, setHardwareDropdown] = useState(false); const [toolsDropdown, setToolsDropdown] = useState(false); const [docsDropdown, setDocsDropdown] = useState(false); const [mounted, setMounted] = useState(false); const pathname = usePathname(); const hardwareRef = useRef(null); const toolsRef = useRef(null); const docsRef = useRef(null); useEffect(() => { setMounted(true); }, []); // Close dropdowns on outside click useEffect(() => { function handleClickOutside(e) { if (hardwareRef.current && !hardwareRef.current.contains(e.target)) { setHardwareDropdown(false); } if (toolsRef.current && !toolsRef.current.contains(e.target)) { setToolsDropdown(false); } if (docsRef.current && !docsRef.current.contains(e.target)) { setDocsDropdown(false); } } document.addEventListener("mousedown", handleClickOutside); return () => document.removeEventListener("mousedown", handleClickOutside); }, []); // 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]); // Close menu on route change useEffect(() => { setDrawerOpen(false); setHardwareDropdown(false); setToolsDropdown(false); setDocsDropdown(false); }, [pathname]); function isActive(href) { if (href === "/") { return pathname === "/"; } return String(pathname).startsWith(href); } const popularChips = [ { name: "ESP32", desc: "Clássico Dual-Core", href: "/series/esp32" }, { name: "ESP32-S3", desc: "IA & USB Nativo", href: "/series/esp32-s3" }, { name: "ESP32-C6", desc: "Wi-Fi 6 + Zigbee/Thread", href: "/series/esp32-c6" }, { name: "ESP32-P4", desc: "Alto Desempenho 400MHz", href: "/series/esp32-p4" }, ]; return (
{/* LOGO */} {/* eslint-disable-next-line @next/next/no-img-element */} ESPDocs Logo

ESPDocs

{/* Desktop Navigation */} {/* Right CTA + Theme + Full Drawer Button */}
{/* CTA Button Desktop */} Seletor de ESP32
{/* Theme Switcher Button */} {/* Full Drawer Trigger Button */}
{/* Full Screen / Side Drawer Portal */} {mounted && createPortal( <> {drawerOpen && (
setDrawerOpen(false)} /> )}
{/* Drawer Header */}
{/* eslint-disable-next-line @next/next/no-img-element */}

Navegação ESPDocs

Guia Técnico em Português

{/* Quick Action Highlights */}
setDrawerOpen(false)} className="flex items-center justify-between p-3 rounded-xl bg-gradient-to-r from-purple-600 to-indigo-600 text-white shadow-sm hover:shadow-md transition-all group" >
Seletor Inteligente
Encontre o ESP32 certo
setDrawerOpen(false)} className="flex items-center justify-between p-3 rounded-xl bg-gradient-to-r from-amber-500 to-orange-500 text-white shadow-sm hover:shadow-md transition-all group" >
Diagnóstico de Falhas
Resolva Brownout, bootloop e erros
{/* Drawer Categorized Menu */} {/* Drawer Footer */}

ESPDocs • 100% em Português

12 Séries • 8 Frameworks • 30+ Erros

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