Files
portifolio-evandrodevbr/lib/seo.ts
Evandro Fonseca JuniorandClaude Sonnet 5.5 85dd326964 feat(seo): og:locale pt_BR em todas as paginas, titulos e descricoes mais curtos, Person com cargo e areas; remove alegacao de LCP do SC Plus
- openGraph.locale pt_BR nas 6 rotas que redefinem openGraph (so a home tinha)
- titulos: cases usam 'Case de Engenharia'; /curriculo, Tauri e Engenharia de Software mais curtos; descricao da home (193 -> 146) e de AS Servicos (184 -> 136)
- Person JSON-LD ganha jobTitle e knowsAbout (dados e texto ja visiveis no site)
- SC Plus: remove 'otimizada para Core Web Vitals' / LCP < 2,5 s; Lighthouse mobile local mediu LCP 3,7 s. Texto passa a afirmar so metadados e dados estruturados (verificados no site)

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-05 00:02:35 -03:00

96 lines
2.4 KiB
TypeScript

import { type ServicePageContent, siteName, siteUrl } from "./site-content";
export const SEO_IDS = {
website: `${siteUrl}/#website`,
person: `${siteUrl}/#person`,
profilePage: `${siteUrl}/curriculo#profile-page`,
} as const;
export function buildWebSiteJsonLd() {
return {
"@type": "WebSite",
"@id": SEO_IDS.website,
url: siteUrl,
name: siteName,
inLanguage: "pt-BR",
publisher: { "@id": SEO_IDS.person },
} as const;
}
export function buildPersonJsonLd() {
return {
"@type": "Person",
"@id": SEO_IDS.person,
name: "Evandro Fonseca Junior",
url: siteUrl,
image: `${siteUrl}/edev.jpg`,
// cargo e áreas vêm de public/portfolio-data.json e estão visíveis em /curriculo e na seção de skills
jobTitle: "Engenheiro da Computação e Desenvolvedor de Software",
knowsAbout: [
"Next.js",
"React",
"TypeScript",
"Node.js",
"Python",
"IoT",
"Computação em nuvem",
"Inteligência artificial",
],
homeLocation: {
"@type": "Place",
name: "Garuva, Santa Catarina, Brasil",
},
sameAs: [
"https://github.com/evandrodevbr",
"https://www.linkedin.com/in/evandro-fonseca-junior-0969aa1b0/",
],
} as const;
}
export function buildProfilePageJsonLd() {
return {
"@type": "ProfilePage",
"@id": SEO_IDS.profilePage,
url: `${siteUrl}/curriculo`,
inLanguage: "pt-BR",
isPartOf: { "@id": SEO_IDS.website },
mainEntity: { "@id": SEO_IDS.person },
} as const;
}
export function buildServiceJsonLd(service: ServicePageContent) {
const pageUrl = `${siteUrl}/servicos/${service.slug}`;
return {
"@type": "Service",
"@id": `${pageUrl}#service`,
url: pageUrl,
name: service.navLabel,
description: service.metaDescription,
provider: { "@id": SEO_IDS.person },
areaServed: [
{ "@type": "City", name: "Garuva" },
{
"@type": "AdministrativeArea",
name: "Norte de Santa Catarina",
},
],
} as const;
}
export function buildBreadcrumbList(
pageUrl: string,
items: readonly (readonly [name: string, url: string])[],
) {
return {
"@type": "BreadcrumbList",
"@id": `${pageUrl}#breadcrumb`,
itemListElement: items.map(([name, item], index) => ({
"@type": "ListItem" as const,
position: index + 1,
name,
item,
})),
} as const;
}