import { paginaMeta, jsonLd } from "@/lib/seo";
import Link from "next/link";
import Image from "next/image";
import Header from "@/components/Header";
import Footer from "@/components/Footer";
import PageHero from "@/components/PageHero";
import { notFound } from "next/navigation";
import seriesDataPt from "@/public/series.json";
import seriesDataEn from "@/data/en/series.json";
import seriesDataEs from "@/data/es/series.json";
import ConnectionsDiagram from "@/components/ConnectionsDiagram";
import SeriesTabMenu from "@/components/SeriesTabMenu";
import PinRestrictions from "@/components/PinRestrictions";
import { getLocalizedHref } from "@/i18n/links";
import {
AlertTriangle,
ArrowLeft,
ArrowRight,
ArrowUpRight,
Battery,
BookOpen,
Code,
Cpu,
Database,
ExternalLink,
FileText,
Lightbulb,
Package,
Scale,
ShieldCheck,
Sliders,
Thermometer,
Wifi,
} from "lucide-react";
export default async function SerieDetail({ params }) {
const { locale, key } = await params;
const isEn = locale === "en";
const isEs = locale === "es";
const currentLocale = isEs ? "es" : isEn ? "en" : "pt";
const seriesData = isEs ? seriesDataEs : isEn ? seriesDataEn : seriesDataPt;
const serie = seriesData[key];
if (!serie) {
notFound();
}
let conexoes = [];
try {
conexoes = isEs
? require(`@/data/es/conexoes/${key}.json`)
: isEn
? require(`@/data/en/conexoes/${key}.json`)
: require(`@/public/conexoes/${key}.json`);
} catch (error) {
console.log(`Arquivo de conexões não encontrado para ${key}`);
}
const seriesKeys = Object.keys(seriesData);
const currentIndex = seriesKeys.indexOf(key);
const previousKey = currentIndex > 0 ? seriesKeys[currentIndex - 1] : null;
const nextKey = currentIndex < seriesKeys.length - 1 ? seriesKeys[currentIndex + 1] : null;
const nao = isEs || isEn ? "No" : "Não";
const naoInformado = isEs ? "No informado" : isEn ? "Not informed" : "Não informado";
const processadorSpecs = isEs
? [
{ label: "Arquitectura", value: serie.arquitetura },
{ label: "Núcleos", value: serie.nucleos },
{ label: "Frecuencia", value: serie.frequencia },
{ label: "Coprocesador ULP", value: serie.coprocessador_ulp || nao },
{ label: "Aceleradores de IA", value: serie.aceleradores_ia || nao },
]
: isEn
? [
{ label: "Architecture", value: serie.arquitetura },
{ label: "Cores", value: serie.nucleos },
{ label: "Frequency", value: serie.frequencia },
{ label: "ULP Coprocessor", value: serie.coprocessador_ulp || nao },
{ label: "AI Accelerators", value: serie.aceleradores_ia || nao },
]
: [
{ label: "Arquitetura", value: serie.arquitetura },
{ label: "Núcleos", value: serie.nucleos },
{ label: "Frequência", value: serie.frequencia },
{ label: "Coprocessador ULP", value: serie.coprocessador_ulp || "Não" },
{ label: "Aceleradores IA", value: serie.aceleradores_ia || "Não" },
];
const seg = serie.seguranca || {};
const segurancaSpecs = isEs
? [
{ label: "AES", value: seg.aes || nao },
{ label: "SHA", value: seg.sha || nao },
{ label: "RSA / MPI", value: seg.rsa || nao },
{ label: "ECC (curvas elípticas)", value: seg.ecc || nao },
{ label: "ECDSA en hardware", value: seg.ecdsa || nao },
{ label: "HMAC", value: seg.hmac || nao },
{ label: "Firma digital (DS)", value: seg.assinatura_digital || nao },
{ label: "Key Manager", value: seg.key_manager || nao },
{ label: "Generador aleatorio (TRNG)", value: seg.rng || nao },
{ label: "Cifrado de flash", value: seg.criptografia_flash || nao },
{ label: "Secure Boot", value: seg.secure_boot || nao },
{ label: "Protección contra DPA", value: seg.protecao_dpa || nao },
]
: isEn
? [
{ label: "AES", value: seg.aes || nao },
{ label: "SHA", value: seg.sha || nao },
{ label: "RSA / MPI", value: seg.rsa || nao },
{ label: "ECC (elliptic curves)", value: seg.ecc || nao },
{ label: "Hardware ECDSA", value: seg.ecdsa || nao },
{ label: "HMAC", value: seg.hmac || nao },
{ label: "Digital Signature (DS)", value: seg.assinatura_digital || nao },
{ label: "Key Manager", value: seg.key_manager || nao },
{ label: "Random Generator (TRNG)", value: seg.rng || nao },
{ label: "Flash Encryption", value: seg.criptografia_flash || nao },
{ label: "Secure Boot", value: seg.secure_boot || nao },
{ label: "DPA Protection", value: seg.protecao_dpa || nao },
]
: [
{ label: "AES", value: seg.aes || "Não" },
{ label: "SHA", value: seg.sha || "Não" },
{ label: "RSA / MPI", value: seg.rsa || "Não" },
{ label: "ECC (curvas elípticas)", value: seg.ecc || "Não" },
{ label: "ECDSA em hardware", value: seg.ecdsa || "Não" },
{ label: "HMAC", value: seg.hmac || "Não" },
{ label: "Assinatura Digital (DS)", value: seg.assinatura_digital || "Não" },
{ label: "Key Manager", value: seg.key_manager || "Não" },
{ label: "Gerador aleatório (RNG)", value: seg.rng || "Não" },
{ label: "Criptografia de flash", value: seg.criptografia_flash || "Não" },
{ label: "Secure Boot", value: seg.secure_boot || "Não" },
{ label: "Proteção contra DPA", value: seg.protecao_dpa || "Não" },
];
const ferramentasSpecs = isEs
? [
{ label: "ESP-IDF mínimo", value: serie.esp_idf_minimo || naoInformado },
{ label: "Core Arduino", value: serie.arduino_core || naoInformado },
{ label: "Depuración", value: serie.depuracao || naoInformado },
{ label: "Encapsulado", value: serie.encapsulamento || naoInformado },
{ label: "Módulos disponibles", value: serie.modulos || naoInformado },
]
: isEn
? [
{ label: "Minimum ESP-IDF", value: serie.esp_idf_minimo || naoInformado },
{ label: "Arduino Core", value: serie.arduino_core || naoInformado },
{ label: "Debugging", value: serie.depuracao || naoInformado },
{ label: "Package", value: serie.encapsulamento || naoInformado },
{ label: "Available Modules", value: serie.modulos || naoInformado },
]
: [
{ label: "ESP-IDF mínimo", value: serie.esp_idf_minimo || "Não informado" },
{ label: "Core Arduino", value: serie.arduino_core || "Não informado" },
{ label: "Depuração", value: serie.depuracao || "Não informado" },
{ label: "Encapsulamento", value: serie.encapsulamento || "Não informado" },
{ label: "Módulos disponíveis", value: serie.modulos || "Não informado" },
];
const conectividadeSpecs = isEs
? [
{ label: "Wi-Fi", value: serie.wifi || nao },
{ label: "Bluetooth", value: serie.bluetooth || nao },
{ label: "Zigbee/Thread", value: serie.zigbee_thread || nao },
{ label: "Matter", value: serie.matter || nao },
{ label: "Ethernet", value: serie.ethernet || serie.ethernet_mac || nao },
{ label: "CAN", value: serie.can || nao },
]
: isEn
? [
{ label: "Wi-Fi", value: serie.wifi || nao },
{ label: "Bluetooth", value: serie.bluetooth || nao },
{ label: "Zigbee/Thread", value: serie.zigbee_thread || nao },
{ label: "Matter", value: serie.matter || nao },
{ label: "Ethernet", value: serie.ethernet || serie.ethernet_mac || nao },
{ label: "CAN", value: serie.can || nao },
]
: [
{ label: "Wi-Fi", value: serie.wifi || "Não" },
{ label: "Bluetooth", value: serie.bluetooth || "Não" },
{ label: "Zigbee/Thread", value: serie.zigbee_thread || "Não" },
{ label: "Matter", value: serie.matter || "Não" },
{ label: "Ethernet", value: serie.ethernet || serie.ethernet_mac || "Não" },
{ label: "CAN", value: serie.can || "Não" },
];
const memoriaSpecs = isEs
? [
{ label: "SRAM", value: serie.memoria_sram },
{ label: "SRAM RTC", value: serie.memoria_sram_rtc },
{ label: "ROM", value: serie.memoria_rom },
{ label: "Flash externa", value: serie.flash_externa },
{ label: "PSRAM externa", value: serie.psram_externa || nao },
]
: isEn
? [
{ label: "SRAM", value: serie.memoria_sram },
{ label: "RTC SRAM", value: serie.memoria_sram_rtc },
{ label: "ROM", value: serie.memoria_rom },
{ label: "External Flash", value: serie.flash_externa },
{ label: "External PSRAM", value: serie.psram_externa || nao },
]
: [
{ label: "SRAM", value: serie.memoria_sram },
{ label: "SRAM RTC", value: serie.memoria_sram_rtc },
{ label: "ROM", value: serie.memoria_rom },
{ label: "Flash Externa", value: serie.flash_externa },
{ label: "PSRAM Externa", value: serie.psram_externa || "Não" },
];
const perifericos = isEs
? [
{ label: "GPIO", value: serie.gpio },
{ label: "ADC", value: serie.adc },
{ label: "DAC", value: serie.dac || nao },
{ label: "Touch", value: serie.touch || nao },
{ label: "UART", value: serie.uart },
{ label: "SPI", value: serie.spi },
{ label: "I2C", value: serie.i2c },
{ label: "I2S", value: serie.i2s },
{ label: "PWM", value: serie.pwm },
{ label: "USB", value: serie.usb || nao },
]
: isEn
? [
{ label: "GPIO", value: serie.gpio },
{ label: "ADC", value: serie.adc },
{ label: "DAC", value: serie.dac || nao },
{ label: "Touch", value: serie.touch || nao },
{ label: "UART", value: serie.uart },
{ label: "SPI", value: serie.spi },
{ label: "I2C", value: serie.i2c },
{ label: "I2S", value: serie.i2s },
{ label: "PWM", value: serie.pwm },
{ label: "USB", value: serie.usb || nao },
]
: [
{ label: "GPIO", value: serie.gpio },
{ label: "ADC", value: serie.adc },
{ label: "DAC", value: serie.dac || "Não" },
{ label: "Touch", value: serie.touch || "Não" },
{ label: "UART", value: serie.uart },
{ label: "SPI", value: serie.spi },
{ label: "I2C", value: serie.i2c },
{ label: "I2S", value: serie.i2s },
{ label: "PWM", value: serie.pwm },
{ label: "USB", value: serie.usb || "Não" },
];
const interfacesEspeciais = [];
if (serie.lcd) interfacesEspeciais.push({ label: "LCD", value: serie.lcd });
if (serie.camera) interfacesEspeciais.push({ label: isEs ? "Cámara" : isEn ? "Camera" : "Câmera", value: serie.camera });
if (serie.mipi_csi) interfacesEspeciais.push({ label: "MIPI CSI", value: serie.mipi_csi });
if (serie.mipi_dsi) interfacesEspeciais.push({ label: "MIPI DSI", value: serie.mipi_dsi });
if (serie.sdio) interfacesEspeciais.push({ label: "SDIO", value: serie.sdio });
if (serie.sensor_hall) interfacesEspeciais.push({ label: isEs ? "Sensor Hall" : isEn ? "Hall Sensor" : "Sensor Hall", value: serie.sensor_hall });
if (serie.sensor_temperatura) interfacesEspeciais.push({ label: isEs ? "Sensor de temperatura" : isEn ? "Temperature Sensor" : "Sensor Temperatura", value: serie.sensor_temperatura });
// Consumo de Energia
const consumoEnergia = [];
if (serie.consumo_energia) {
const modoLabelsPt = {
'active': 'Modo Ativo',
'active_cpu_240mhz': 'Ativo (CPU 240MHz)',
'active_cpu_160mhz': 'Ativo (CPU 160MHz)',
'active_wifi_tx': 'Ativo (Wi-Fi TX)',
'active_wifi_tx_peak': 'Ativo (Wi-Fi TX Pico)',
'active_wifi': 'Ativo (Wi-Fi)',
'active_wifi6': 'Ativo (Wi-Fi 6)',
'modem_sleep': 'Modem Sleep',
'modem_sleep_cpu_160mhz': 'Modem Sleep (CPU 160MHz)',
'light_sleep': 'Light Sleep',
'deep_sleep': 'Deep Sleep',
'hibernation': 'Hibernação'
};
const modoLabelsEn = {
'active': 'Active Mode',
'active_cpu_240mhz': 'Active (CPU 240MHz)',
'active_cpu_160mhz': 'Active (CPU 160MHz)',
'active_wifi_tx': 'Active (Wi-Fi TX)',
'active_wifi_tx_peak': 'Active (Wi-Fi TX Peak)',
'active_wifi': 'Active (Wi-Fi)',
'active_wifi6': 'Active (Wi-Fi 6)',
'modem_sleep': 'Modem Sleep',
'modem_sleep_cpu_160mhz': 'Modem Sleep (CPU 160MHz)',
'light_sleep': 'Light Sleep',
'deep_sleep': 'Deep Sleep',
'hibernation': 'Hibernation'
};
const modoLabelsEs = {
'active': 'Modo activo',
'active_cpu_240mhz': 'Activo (CPU 240MHz)',
'active_cpu_160mhz': 'Activo (CPU 160MHz)',
'active_wifi_tx': 'Activo (Wi-Fi TX)',
'active_wifi_tx_peak': 'Activo (Wi-Fi TX Pico)',
'active_wifi': 'Activo (Wi-Fi)',
'active_wifi6': 'Activo (Wi-Fi 6)',
'modem_sleep': 'Modem Sleep',
'modem_sleep_cpu_160mhz': 'Modem Sleep (CPU 160MHz)',
'light_sleep': 'Light Sleep',
'deep_sleep': 'Deep Sleep',
'hibernation': 'Hibernación'
};
const modoLabels = isEs ? modoLabelsEs : isEn ? modoLabelsEn : modoLabelsPt;
Object.entries(serie.consumo_energia).forEach(([modo, consumo]) => {
consumoEnergia.push({
label: modoLabels[modo] || modo.replace(/_/g, ' ').replace(/\b\w/g, (l) => l.toUpperCase()),
value: consumo
});
});
}
const tabs = [
{
id: "devboard",
label: isEs ? "Placa de desarrollo" : isEn ? "Development board" : "Placa de desenvolvimento",
available: serie.placa,
content: (
{isEs ? "Kit de desarrollo oficial" : isEn ? "Official development kit" : "Kit de desenvolvimento oficial"}
{isEs ? (
<>Placa estándar de Espressif para la serie {key}.>
) : isEn ? (
<>Official Espressif board for the {key} series.>
) : (
<>Placa padrão da Espressif para a série {key}.>
)}
),
},
{
id: "connections",
label: isEs ? "Diagrama de patillaje" : isEn ? "Pinout diagram" : "Diagrama de conexões",
available: conexoes.length > 0,
content: (
{isEs ? "Este es el diagrama del chip, no de la placa" : isEn ? "This is the chip diagram, not the development board" : "Este é o diagrama do chip, não da placa"}
{isEs ? (
`El mapa muestra las conexiones del silicio del ${key}. Cada placa de desarrollo expone solo parte de ellas o las enruta de otra forma.`
) : isEn ? (
`The map shows the silicon connections for the ${key}. Each development board exposes only a subset or routes them differently.`
) : (
<>
O mapa mostra as conexões do silício do {key} . Cada placa de desenvolvimento
expõe só parte delas, ou as roteia de outra forma.
>
)}
{isEs ? "Casi todos los pines son reconfigurables" : isEn ? "Almost every pin is reconfigurable" : "Quase todo pino é reconfigurável"}
{isEs ? (
<>
La matriz de E/S del {key} permite mover buses SPI, I2C, UART, PWM y cámara/pantalla
a la mayoría de los pines digitales. Para las restricciones de strapping y pines analógicos,
consulte la{" "}
guía oficial de GPIO
.
>
) : isEn ? (
<>
The {key} IO matrix allows moving SPI, I2C, UART, PWM, and camera/display buses
to most digital pins. For strapping restrictions and analog pins, consult the{" "}
official GPIO guide
.
>
) : (
<>
A matriz de IO do {key} permite mover SPI, I2C, UART, PWM e barramentos de câmera ou display
para a maioria dos pinos digitais. Para as restrições de strapping e dos pinos analógicos,
consulte o{" "}
guia oficial de GPIO
.
>
)}
),
},
];
const secoes = [
{ id: "processador", titulo: isEs ? "Procesador" : isEn ? "Processor" : "Processador", icon: Cpu, specs: processadorSpecs },
{ id: "conectividade", titulo: isEs ? "Conectividad" : isEn ? "Connectivity" : "Conectividade", icon: Wifi, specs: conectividadeSpecs },
{ id: "ferramentas", titulo: isEs ? "Herramientas y disponibilidad" : isEn ? "Tools and availability" : "Ferramentas e disponibilidade", icon: Package, specs: ferramentasSpecs },
{ id: "seguranca", titulo: isEs ? "Seguridad" : isEn ? "Security" : "Segurança", icon: ShieldCheck, specs: segurancaSpecs },
{ id: "memoria", titulo: isEs ? "Memoria" : isEn ? "Memory" : "Memória", icon: Database, specs: memoriaSpecs },
...(consumoEnergia.length > 0
? [{
id: "energia",
titulo: isEs ? "Consumo de energía" : isEn ? "Power consumption" : "Consumo de energia",
icon: Battery,
specs: consumoEnergia,
nota: isEs
? "Valores típicos a 3,3 V y 25 °C. El consumo real depende del ciclo de trabajo de la radio y de la frecuencia de reloj configurada."
: isEn
? "Typical values at 3.3 V and 25 °C. Actual power consumption depends on radio duty cycle and configured clock frequency."
: "Valores típicos a 3,3 V e 25 °C. O consumo real depende do ciclo de trabalho do rádio e da frequência de clock configurada.",
}]
: []),
{ id: "perifericos", titulo: isEs ? "Periféricos" : isEn ? "Peripherals" : "Periféricos", icon: Sliders, specs: perifericos },
...(interfacesEspeciais.length > 0
? [{ id: "interfaces", titulo: isEs ? "Interfaces especiales" : isEn ? "Special interfaces" : "Interfaces especiais", icon: Sliders, specs: interfacesEspeciais }]
: []),
{
id: "temperatura",
titulo: isEs ? "Límites de temperatura" : isEn ? "Temperature limits" : "Limites de temperatura",
icon: Thermometer,
specs: [
{ label: isEs ? "Operación" : isEn ? "Operating" : "Operação", value: serie.temperatura_operacao },
{ label: isEs ? "Almacenamiento" : isEn ? "Storage" : "Armazenamento", value: serie.temperatura_armazenamento },
],
},
];
const fatos = [
{ label: isEs ? "Procesador" : isEn ? "Processor" : "Processador", value: String(serie.nucleos).includes("2") ? "Dual-core" : "Single-core", detail: serie.frequencia },
{ label: "SRAM", value: serie.memoria_sram, detail: isEs ? `+ ${serie.memoria_sram_rtc} de SRAM RTC` : isEn ? `+ ${serie.memoria_sram_rtc} RTC SRAM` : `+ ${serie.memoria_sram_rtc} de SRAM RTC` },
{ label: "GPIO", value: serie.gpio, detail: isEs ? "pines programables" : isEn ? "programmable pins" : "pinos programáveis" },
{ label: isEs ? "Arquitectura" : isEn ? "Architecture" : "Arquitetura", value: String(serie.arquitetura).includes("RISC-V") ? "RISC-V" : "Xtensa", detail: serie.arquitetura },
];
return (
{serie.datasheet ? (
{isEs ? "Datasheet oficial" : isEn ? "Official datasheet" : "Datasheet oficial"}
) : (
{isEs ? "Datasheet aún no publicado" : isEn ? "Datasheet not yet published" : "Datasheet ainda não publicado"}
)}
{serie.guia_de_programacao && (
{isEs ? "Guía de programación" : isEn ? "Programming guide" : "Guia de programação"}
)}
{serie.manual_tecnico && (
{isEs ? "Manual de referencia técnica" : isEn ? "Technical reference manual" : "Manual técnico"}
)}
{fatos.map((fato) => (
{fato.label}
{fato.value}
{fato.detail}
))}
{serie.status_documentacao && (
{isEs ? "Documentación preliminar" : isEn ? "Preliminary documentation" : "Documentação preliminar"}
{serie.status_documentacao}
)}
{secoes.map((secao) => (
{secao.titulo}
))}
{secoes.map((secao) => (
))}
{isEs ? (
<>¿Listo para prototipar con {key}?>
) : isEn ? (
<>Ready to prototype with {key}?>
) : (
<>Pronto para prototipar o {key}?>
)}
{isEs
? "Explore las placas de desarrollo disponibles para esta serie, con USB, sensores integrados y enlaces a la tienda oficial."
: isEn
? "Explore development boards available for this series, with USB, onboard sensors, and official store links."
: "Veja as placas de desenvolvimento disponíveis para a série, com USB, sensores integrados e link para a loja oficial."}
{isEs ? "Ver placas" : isEn ? "View boards" : "Ver placas"}
{previousKey ? (
{isEs ? "Serie anterior" : isEn ? "Previous series" : "Série anterior"}
{previousKey}
) : (
)}
{isEs ? "Comparar series" : isEn ? "Compare series" : "Comparar séries"}
{nextKey ? (
{isEs ? "Siguiente serie" : isEn ? "Next series" : "Próxima série"}
{nextKey}
) : (
)}
);
}
function SpecSection({ id, titulo, icon: Icon, specs, nota }) {
return (
{titulo}
{nota && {nota}
}
{specs.map((spec) => {
const negativo = /^n[ãa]o\b|^no\b/i.test(String(spec.value));
return (
{spec.label}
{spec.value}
);
})}
);
}
export async function generateMetadata({ params }) {
const { locale, key } = await params;
const isEn = locale === "en";
const isEs = locale === "es";
const currentLocale = isEs ? "es" : isEn ? "en" : "pt";
const seriesData = isEs ? seriesDataEs : isEn ? seriesDataEn : seriesDataPt;
const serie = seriesData[key];
if (!serie) {
return { title: isEs ? "Serie no encontrada" : isEn ? "Series not found" : "Série não encontrada", robots: { index: false, follow: false } };
}
const radio = [
String(serie.wifi).startsWith("Não") || String(serie.wifi).startsWith("No") ? null : serie.wifi.split(" (")[0],
String(serie.bluetooth).startsWith("Não") || String(serie.bluetooth).startsWith("No") ? null : serie.bluetooth.split(" (")[0],
serie.zigbee_thread && !String(serie.zigbee_thread).startsWith("Não") && !String(serie.zigbee_thread).startsWith("No") ? "802.15.4" : null,
].filter(Boolean).join(", ");
const descricao = isEs
? `${serie.nome_completo}: ${serie.arquitetura}, ${serie.frequencia}, ` +
`${serie.memoria_sram} de SRAM y ${serie.gpio} GPIO` +
(radio ? `. Radio: ${radio}` : "") +
`. Patillaje completo, periféricos, seguridad por hardware y pines restringidos, en español.`
: isEn
? `${serie.nome_completo}: ${serie.arquitetura}, ${serie.frequencia}, ` +
`${serie.memoria_sram} SRAM, and ${serie.gpio} GPIOs` +
(radio ? `. Radio: ${radio}` : "") +
`. Complete pinout, peripherals, hardware security, and restricted pins in English.`
: `${serie.nome_completo}: ${serie.arquitetura}, ${serie.frequencia.replace("Até ", "até ")}, ` +
`${serie.memoria_sram} de SRAM e ${serie.gpio} GPIOs` +
(radio ? `. Rádio: ${radio}` : "") +
`. Pinagem completa, periféricos, segurança em hardware e pinos com restrição, em português.`;
const imagem = serie.placa
? [{ url: serie.placa, width: 1600, height: 1091, alt: isEs ? `Patillaje de ${serie.nome_completo}` : isEn ? `Pinout of ${serie.nome_completo}` : `Pinagem do ${serie.nome_completo}` }]
: [{ url: "/opengraph-image.png", width: 1200, height: 630, alt: "ESPDocs" }];
const keywords = isEs
? [
serie.nome_completo, `${serie.nome_completo} pinout`, `${serie.nome_completo} patillaje`,
`${serie.nome_completo} datasheet`, `${serie.nome_completo} especificaciones`,
`${serie.nome_completo} español`, "ESP32", "Espressif", "microcontrolador",
]
: isEn
? [
serie.nome_completo, `${serie.nome_completo} pinout`,
`${serie.nome_completo} datasheet`, `${serie.nome_completo} specifications`,
"ESP32", "Espressif", "microcontroller",
]
: [
serie.nome_completo, `${serie.nome_completo} pinout`,
`${serie.nome_completo} datasheet`, `${serie.nome_completo} especificações`,
`${serie.nome_completo} português`, "ESP32", "Espressif", "microcontrolador",
];
const meta = {
...paginaMeta({
titulo: isEs ? `${serie.nome_completo}: especificaciones y patillaje` : isEn ? `${serie.nome_completo}: specifications and pinout` : `${serie.nome_completo}: especificações e pinagem`,
descricao,
caminho: `/series/${key}`,
tipo: "article",
locale: currentLocale,
keywords,
}),
other: { "article:section": isEs ? "Series ESP32" : isEn ? "ESP32 Series" : "Séries ESP32" },
};
meta.openGraph = { ...meta.openGraph, images: imagem };
meta.twitter = { ...meta.twitter, images: imagem };
return meta;
}
export async function generateStaticParams() {
return Object.keys(seriesDataPt).map((key) => ({
key: key,
}));
}