"use client"; import { useMemo, useState } from "react"; import { usePathname } from "next/navigation"; import Header from "@/components/Header"; import Footer from "@/components/Footer"; import PageHero from "@/components/PageHero"; import Link from "next/link"; import seriesDataPt from "@/public/series.json"; import seriesDataEn from "@/data/en/series.json"; import seriesDataEs from "@/data/es/series.json"; import seriesDataFr from "@/data/fr/series.json"; import seriesDataDe from "@/data/de/series.json"; import { getLocalizedHref } from "@/i18n/links"; import { AlertTriangle, ArrowRight, ArrowUpRight, Compass, Home, Scale, ShieldCheck, Sparkles, } from "lucide-react"; const FILTROS_PT = [ { id: "todas", rotulo: "Todas", testa: () => true }, { id: "riscv", rotulo: "RISC-V", testa: (s) => s.arquitetura.includes("RISC-V") }, { id: "xtensa", rotulo: "Xtensa", testa: (s) => !s.arquitetura.includes("RISC-V") }, { id: "matter", rotulo: "Matter", testa: (s) => s.matter === "Sim" }, { id: "ia", rotulo: "Aceleração de IA", testa: (s) => Boolean(s.aceleradores_ia) }, ]; const FILTROS_EN = [ { id: "todas", rotulo: "All", testa: () => true }, { id: "riscv", rotulo: "RISC-V", testa: (s) => s.arquitetura.includes("RISC-V") }, { id: "xtensa", rotulo: "Xtensa", testa: (s) => !s.arquitetura.includes("RISC-V") }, { id: "matter", rotulo: "Matter", testa: (s) => s.matter === "Yes" || s.matter === "Sim" }, { id: "ia", rotulo: "AI Acceleration", testa: (s) => Boolean(s.aceleradores_ia) }, ]; const FILTROS_ES = [ { id: "todas", rotulo: "Todas", testa: () => true }, { id: "riscv", rotulo: "RISC-V", testa: (s) => s.arquitetura.includes("RISC-V") }, { id: "xtensa", rotulo: "Xtensa", testa: (s) => !s.arquitetura.includes("RISC-V") }, { id: "matter", rotulo: "Matter", testa: (s) => s.matter === "Yes" || s.matter === "Sim" || s.matter === "Sí" }, { id: "ia", rotulo: "Aceleración de IA", testa: (s) => Boolean(s.aceleradores_ia) }, ]; const FILTROS_FR = [ { id: "todas", rotulo: "Toutes", testa: () => true }, { id: "riscv", rotulo: "RISC-V", testa: (s) => s.arquitetura.includes("RISC-V") }, { id: "xtensa", rotulo: "Xtensa", testa: (s) => !s.arquitetura.includes("RISC-V") }, { id: "matter", rotulo: "Matter", testa: (s) => s.matter === "Oui" || s.matter === "Yes" || s.matter === "Sim" || s.matter === "Sí" }, { id: "ia", rotulo: "Accélération IA", testa: (s) => Boolean(s.aceleradores_ia) }, ]; const FILTROS_DE = [ { id: "todas", rotulo: "Alle", testa: () => true }, { id: "riscv", rotulo: "RISC-V", testa: (s) => s.arquitetura.includes("RISC-V") }, { id: "xtensa", rotulo: "Xtensa", testa: (s) => !s.arquitetura.includes("RISC-V") }, { id: "matter", rotulo: "Matter", testa: (s) => s.matter === "Ja" || s.matter === "Yes" || s.matter === "Sim" || s.matter === "Sí" }, { id: "ia", rotulo: "KI-Beschleunigung", testa: (s) => Boolean(s.aceleradores_ia) }, ]; /** Marcador de segurança: o recurso que diferencia a série, não o que todas têm. */ function nivelSeguranca(serie, isEn, isEs, isFr, isDe) { const seg = serie.seguranca || {}; if (seg.key_manager === "Sim" || seg.key_manager === "Yes" || seg.key_manager === "Sí" || seg.key_manager === "Oui" || seg.key_manager === "Ja") return "Key Manager"; if (String(seg.ecdsa).startsWith("Sim") || String(seg.ecdsa).startsWith("Yes") || String(seg.ecdsa).startsWith("Sí") || String(seg.ecdsa).startsWith("Oui") || String(seg.ecdsa).startsWith("Ja")) { return isDe ? "Hardware-ECDSA" : isFr ? "ECDSA matériel" : isEs ? "ECDSA en hardware" : isEn ? "Hardware ECDSA" : "ECDSA em hardware"; } if (String(seg.ecc).startsWith("Sim") || String(seg.ecc).startsWith("Yes") || String(seg.ecc).startsWith("Sí") || String(seg.ecc).startsWith("Oui") || String(seg.ecc).startsWith("Ja")) { return isDe ? "Hardware-ECC" : isFr ? "ECC matériel" : isEs ? "ECC en hardware" : isEn ? "Hardware ECC" : "ECC em hardware"; } if (String(seg.aes).startsWith("AES")) return "AES + SHA"; return isDe ? "Nur SHA" : isFr ? "SHA uniquement" : isEs ? "Solo SHA" : isEn ? "SHA only" : "Só SHA"; } const simPt = (v) => !String(v).includes("Não"); const simEn = (v) => !String(v).includes("No") && !String(v).includes("Não"); const simEs = (v) => !String(v).includes("No") && !String(v).includes("Não"); const simFr = (v) => !String(v).includes("Non") && !String(v).includes("No") && !String(v).includes("Não"); const simDe = (v) => !String(v).includes("Nein") && !String(v).includes("No") && !String(v).includes("Não"); export default function Series() { const pathname = usePathname(); const isEn = pathname?.startsWith("/en"); const isEs = pathname?.startsWith("/es"); const isFr = pathname?.startsWith("/fr"); const isDe = pathname?.startsWith("/de"); const currentLocale = isDe ? "de" : isFr ? "fr" : isEs ? "es" : isEn ? "en" : "pt"; const seriesData = isDe ? seriesDataDe : isFr ? seriesDataFr : isEs ? seriesDataEs : isEn ? seriesDataEn : seriesDataPt; const filtros = isDe ? FILTROS_DE : isFr ? FILTROS_FR : isEs ? FILTROS_ES : isEn ? FILTROS_EN : FILTROS_PT; const [filtro, setFiltro] = useState("todas"); const todas = Object.entries(seriesData); const ativo = filtros.find((f) => f.id === filtro) || filtros[0]; const series = useMemo(() => todas.filter(([, s]) => ativo.testa(s)), [todas, ativo]); return (
{filtros.map((f) => ( ))}

{series.length}{" "} {series.length === 1 ? isDe ? "Serie" : isFr ? "série" : isEs ? "serie" : isEn ? "series" : "série" : isDe ? "Serien" : isFr ? "séries" : isEs ? "series" : isEn ? "series" : "séries"}

{series.map(([key, serie]) => { const riscv = serie.arquitetura.includes("RISC-V"); const fatos = isDe ? [ ["Kerne", serie.nucleos], ["Taktfrequenz", serie.frequencia], ["SRAM", serie.memoria_sram], ["Wi-Fi", simDe(serie.wifi) ? "Ja" : "Nein"], ["Bluetooth", String(serie.bluetooth).includes("Nein") || String(serie.bluetooth).includes("No") || String(serie.bluetooth).includes("Não") ? "Nein" : "Ja"], serie.consumo_energia?.deep_sleep ? ["Deep sleep", serie.consumo_energia.deep_sleep] : null, ].filter(Boolean) : isFr ? [ ["Cœurs", serie.nucleos], ["Fréquence", serie.frequencia], ["SRAM", serie.memoria_sram], ["Wi-Fi", simFr(serie.wifi) ? "Oui" : "Non"], ["Bluetooth", String(serie.bluetooth).includes("Non") || String(serie.bluetooth).includes("No") || String(serie.bluetooth).includes("Não") ? "Non" : "Oui"], serie.consumo_energia?.deep_sleep ? ["Deep sleep", serie.consumo_energia.deep_sleep] : null, ].filter(Boolean) : isEs ? [ ["Núcleos", serie.nucleos], ["Frecuencia", serie.frequencia], ["SRAM", serie.memoria_sram], ["Wi-Fi", simEs(serie.wifi) ? "Sí" : "No"], ["Bluetooth", String(serie.bluetooth).includes("No") || String(serie.bluetooth).includes("Não") ? "No" : "Sí"], serie.consumo_energia?.deep_sleep ? ["Deep sleep", serie.consumo_energia.deep_sleep] : null, ].filter(Boolean) : isEn ? [ ["Cores", serie.nucleos], ["Frequency", serie.frequencia], ["SRAM", serie.memoria_sram], ["Wi-Fi", simEn(serie.wifi) ? "Yes" : "No"], ["Bluetooth", String(serie.bluetooth).includes("No") || String(serie.bluetooth).includes("Não") ? "No" : "Yes"], serie.consumo_energia?.deep_sleep ? ["Deep sleep", serie.consumo_energia.deep_sleep] : null, ].filter(Boolean) : [ ["Núcleos", serie.nucleos], ["Frequência", serie.frequencia], ["SRAM", serie.memoria_sram], ["Wi-Fi", simPt(serie.wifi) ? "Sim" : "Não"], ["Bluetooth", serie.bluetooth === "Não" ? "Não" : "Sim"], serie.consumo_energia?.deep_sleep ? ["Deep sleep", serie.consumo_energia.deep_sleep] : null, ].filter(Boolean); return (

{key}

{riscv ? "RISC-V" : "Xtensa"}

{serie.descricao}

{fatos.map(([rotulo, valor]) => (
{rotulo}
{valor}
))}
    {serie.aceleradores_ia && (
  • )}
  • {(serie.matter === "Sim" || serie.matter === "Yes" || serie.matter === "Sí" || serie.matter === "Oui" || serie.matter === "Ja") && (
  • )} {serie.status_documentacao && (
  • )}
{isDe ? "Datenblatt öffnen" : isFr ? "Ouvrir la fiche" : isEs ? "Abrir ficha" : isEn ? "Open datasheet" : "Abrir ficha"} ); })}

{isDe ? "Unsicher zwischen zwei Serien?" : isFr ? "Vous hésitez entre deux séries ?" : isEs ? "¿Tiene dudas entre dos series?" : isEn ? "Unsure between two series?" : "Ficou em dúvida entre duas séries?"}

{isDe ? "Der Vergleicher stellt bis zu vier Modelle gegenüber: Kerne, Funk, Speicher, Peripherie und Sicherheit." : isFr ? "Le comparateur place jusqu'à quatre modèles côte à côte : cœurs, radio, mémoire, périphériques et sécurité." : isEs ? "El comparador coloca hasta cuatro modelos lado a lado: núcleos, radio, memoria, periféricos y seguridad." : isEn ? "The comparator tool puts up to four models side by side: cores, radio, memory, peripherals, and security." : "O comparador coloca até quatro modelos lado a lado: núcleos, rádio, memória, periféricos e segurança."}

); }