"use client"; import { useState, useMemo, useRef } from "react"; import Header from "@/components/Header"; import Footer from "@/components/Footer"; import Link from "next/link"; import { categoriasGlossario } from "@/lib/glossarioData"; import { BookOpen, Search, Cpu, Database, Wifi, Sliders, Sparkles, BatteryCharging, Code2, Link2, Check, ArrowRight, Lightbulb, HelpCircle, X, SlidersHorizontal, Filter, RotateCcw, Tag, ShieldCheck, } from "lucide-react"; export default function GlossarioPage() { const [busca, setBusca] = useState(""); const [categoriaSelecionada, setCategoriaSelecionada] = useState("todas"); const [letraFiltro, setLetraFiltro] = useState(null); const [copiadoSlug, setCopiadoSlug] = useState(null); const searchInputRef = useRef(null); // Sugestões populares para busca rápida const buscasPopulares = [ { rotulo: "GPIO", emoji: "🔌" }, { rotulo: "ULP", emoji: "⚡" }, { rotulo: "PSRAM", emoji: "💾" }, { rotulo: "Strapping Pins", emoji: "🚀" }, { rotulo: "Deep Sleep", emoji: "🔋" }, { rotulo: "OTA", emoji: "📡" }, { rotulo: "Matter", emoji: "🌐" }, { rotulo: "Secure Boot", emoji: "🔒" }, { rotulo: "Wi-Fi 6", emoji: "📶" }, { rotulo: "MIPI", emoji: "✨" }, ]; // Mapeamento de ícones por nome const iconMap = { Cpu: , Database: , Wifi: , Sliders: , Sparkles: , BatteryCharging: , Code2: , ShieldCheck: , }; // Lista de todos os termos com metadados de categoria const todosOsTermos = useMemo(() => { return categoriasGlossario.flatMap((cat) => cat.termos.map((t) => ({ ...t, categoriaId: cat.id, categoriaNome: cat.nome, categoriaCor: cat.cor, categoriaIcone: cat.icone, categoriaEmoji: cat.emoji, slug: t.termo.toLowerCase().replace(/[\s()/²]+/g, "-"), primeiraLetra: t.termo.charAt(0).toUpperCase(), })) ); }, []); // Todas as letras do alfabeto de A a Z com indicador de existência de termos const alfabeto = useMemo(() => { const letras = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".split(""); const setDisponivel = new Set( todosOsTermos.map((t) => t.termo.charAt(0).toUpperCase()) ); return letras.map((letra) => ({ letra, temTermos: setDisponivel.has(letra), })); }, [todosOsTermos]); // Filtragem dinâmica const termosFiltrados = useMemo(() => { const termoBusca = busca.toLowerCase().trim(); return todosOsTermos.filter((item) => { const matchCategoria = categoriaSelecionada === "todas" || item.categoriaId === categoriaSelecionada; const matchLetra = !letraFiltro || item.primeiraLetra === letraFiltro; const matchBusca = !termoBusca || item.termo.toLowerCase().includes(termoBusca) || item.definicao.toLowerCase().includes(termoBusca) || item.exemplo.toLowerCase().includes(termoBusca) || item.categoriaNome.toLowerCase().includes(termoBusca); return matchCategoria && matchLetra && matchBusca; }); }, [todosOsTermos, categoriaSelecionada, letraFiltro, busca]); const temFiltroAtivo = busca.trim() !== "" || categoriaSelecionada !== "todas" || letraFiltro !== null; const limparTodosFiltros = () => { setBusca(""); setCategoriaSelecionada("todas"); setLetraFiltro(null); searchInputRef.current?.focus(); }; const copiarLinkTermo = (slug) => { const url = `${window.location.origin}/glossario#${slug}`; navigator.clipboard.writeText(url); setCopiadoSlug(slug); setTimeout(() => setCopiadoSlug(null), 2000); }; const catAtivaInfo = categoriasGlossario.find( (c) => c.id === categoriaSelecionada ); return (
{/* Hero Section */}
Enciclopédia & Conceitos do ESP32

Glossário Técnico

Consulte definições diretas, parâmetros de hardware e exemplos práticos dos termos fundamentais do ecossistema ESP32.

{/* 1. PAINEL INTEGRADO DE BUSCA & FILTRAGEM (REDESIGN COMPLETO) */}
{/* Barra de Pesquisa Principal */}
setBusca(e.target.value)} placeholder="Pesquisar por termo, sigla ou conceito (ex: GPIO, ULP, PSRAM, OTA, Deep Sleep)..." className="w-full bg-slate-50 dark:bg-slate-950/70 pl-13 sm:pl-14 pr-24 sm:pr-28 py-3.5 sm:py-4 rounded-2xl border border-slate-250 dark:border-slate-800 text-sm sm:text-base font-medium placeholder:text-slate-400 dark:placeholder:text-slate-500 focus:outline-none focus:ring-2 focus:ring-purple-500 focus:border-transparent transition-all shadow-inner" /> {/* Lado Direito da Barra de Pesquisa: Botão Limpar ou Tag de Contagem */}
{busca ? ( ) : ( {termosFiltrados.length} {termosFiltrados.length === 1 ? "termo" : "termos"} )}
{/* Atalhos de Pesquisa Rápida (Tags Populares) */}
Populares: {buscasPopulares.map((item) => ( ))}
{/* Seletor de Categorias em Grid/Flex Moderno */}
Filtrar por Categoria {categoriaSelecionada !== "todas" && ( )}
{/* Botão Todas */} {/* Categorias Individuais */} {categoriasGlossario.map((cat) => { const ativa = categoriaSelecionada === cat.id; return ( ); })}
{/* Scrubber de Índice Alfabético (A-Z) */}
Índice A-Z:
{alfabeto.map(({ letra, temTermos }) => { const ativo = letraFiltro === letra; if (!temTermos) { return ( {letra} ); } return ( ); })}
{/* Fita de Filtros Ativos (Aparece quando algum filtro está ativo) */} {temFiltroAtivo && (
Filtros ativos: {busca && ( Busca: "{busca}" )} {categoriaSelecionada !== "todas" && ( Categoria: {catAtivaInfo?.nome} )} {letraFiltro && ( Letra: {letraFiltro} )}
)}
{/* 2. GRID DE CARDS DO GLOSSÁRIO */}
{termosFiltrados.length === 0 ? (

Nenhum termo encontrado

Não encontramos resultados para sua pesquisa com os filtros selecionados.

) : (
{termosFiltrados.map((item) => { return (
{/* Header do Card */}
{item.categoriaEmoji} {item.categoriaNome}
{/* Título do Termo */}

{item.termo}

{/* Definição */}

{/* Caixa de Exemplo Prático */}
Exemplo Prático

); })}
)}
{/* 3. CTA & PRÓXIMOS PASSOS */}
Continue Explorando

Pronto para aplicar na prática?

Agora que você domina os conceitos técnicos, compare as especificações das séries ou use o seletor inteligente para encontrar o microcontrolador ideal para seu projeto.

Explorar Séries ESP32 Seletor Inteligente Guia de Diagnóstico & Erros
); } /** * Função utilitária que detecta nomes de séries do ESP32 dentro do texto e os converte em links clicáveis. */ function TextoComLinks({ texto }) { if (!texto) return null; const seriesKeys = [ "ESP32-S31", "ESP32-C61", "ESP32-S2", "ESP32-S3", "ESP32-C2", "ESP32-C3", "ESP32-C5", "ESP32-C6", "ESP32-P4", "ESP32-H2", "ESP32-H4", "ESP32", ]; const regex = new RegExp(`\\b(${seriesKeys.join("|")})\\b`, "g"); const partes = texto.split(regex); return ( <> {partes.map((parte, i) => { if (seriesKeys.includes(parte)) { return ( {parte} ); } return parte; })} ); }