- 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]>
96 lines
2.4 KiB
TypeScript
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;
|
|
}
|