feat(servicos): topo, entregáveis e cases por serviço, assunto próprio no WhatsApp e títulos curtos

This commit is contained in:
Evandro Fonseca Junior committed 2026-10-14 22:54:18 -03:00
1 parent cf360041bd
commit 2fd8b063d9
33 files changed
+1578 -300

No files matched your search

+29 -41
View File
@@ -14,7 +14,6 @@ export const SEO_IDS = {
website: `${siteUrl}/#website`,
person: `${siteUrl}/#person`,
profilePage: `${siteUrl}/curriculo#profile-page`,
professionalService: `${siteUrl}/#professional-service`,
} as const;
export function buildWebSiteJsonLd() {
@@ -51,6 +50,7 @@ export function buildPersonJsonLd() {
"@type": "Place",
name: "Garuva, Santa Catarina, Brasil",
},
// perfis profissionais públicos e no ar; a conta do GitHub foi suspensa (404) e o Instagram fica fora por política
sameAs: ["https://www.linkedin.com/in/evandrodevbr/"],
} as const;
}
@@ -67,39 +67,34 @@ export function buildProfilePageJsonLd() {
}
/**
* O negócio como `ProfessionalService`: onde atende (Garuva, Joinville, Santa Catarina e o Brasil, de forma remota) e as três ofertas
* da home como catálogo. Sem endereço de rua, preço, prazo, telefone ou e-mail: o que não está publicado no site não entra nos
* dados estruturados. Só o construtor: quem o coloca na página é a home.
* Área de atendimento de todo nó `Service` (as ofertas da home e as páginas de serviço): a mesma do texto visível, "Garuva e
* Joinville (SC), atendimento remoto em todo o Brasil". Um valor só, para os dados estruturados não divergirem entre páginas.
*/
export function buildProfessionalServiceJsonLd() {
return {
"@type": "ProfessionalService",
"@id": SEO_IDS.professionalService,
name: siteName,
url: siteUrl,
description:
"Sites, sistemas web e aplicativos sob medida, e revisão de sistemas que já existem, inclusive feitos com IA. Garuva e Joinville (SC), remoto em todo o Brasil.",
founder: { "@id": SEO_IDS.person },
areaServed: [
{ "@type": "City", name: "Garuva" },
{ "@type": "City", name: "Joinville" },
{ "@type": "AdministrativeArea", name: "Santa Catarina" },
{ "@type": "Country", name: "Brasil" },
],
hasOfferCatalog: {
"@type": "OfferCatalog",
name: "Serviços de desenvolvimento de software",
itemListElement: serviceOffers.map((offer) => ({
"@type": "Offer",
itemOffered: {
"@type": "Service",
name: offer.name,
description: offer.summary,
url: `${siteUrl}${offer.href}`,
},
})),
},
} as const;
const serviceAreaServed = [
{ "@type": "City", name: "Garuva" },
{ "@type": "City", name: "Joinville" },
{ "@type": "AdministrativeArea", name: "Santa Catarina" },
{ "@type": "Country", name: "Brasil" },
] as const;
/**
* As três ofertas da home como nós `Service`, ligados à pessoa (`provider`) e com a área de atendimento (`serviceAreaServed`).
* Nada de `ProfessionalService`, `LocalBusiness` ou catálogo de ofertas: a política
* de docs/seo-geo-operations.md os exclui sem entidade ou local comprovado. Sem endereço, preço, prazo, telefone ou e-mail: o que
* não está publicado no site não entra nos dados estruturados. Só o construtor: quem o coloca na página é a home.
* O `url` é a página da oferta (a revisão abre /ia). O `@id` é da home, para não repetir o do nó que a página do serviço emite
* com outra descrição.
*/
export function buildOfferServicesJsonLd() {
return serviceOffers.map((offer) => ({
"@type": "Service",
"@id": `${siteUrl}/#service-${offer.id}`,
name: offer.name,
description: offer.summary,
url: `${siteUrl}${offer.href}`,
provider: { "@id": SEO_IDS.person },
areaServed: serviceAreaServed,
}));
}
export function buildServiceJsonLd(service: ServicePageContent) {
@@ -112,14 +107,7 @@ export function buildServiceJsonLd(service: ServicePageContent) {
name: service.navLabel,
description: service.metaDescription,
provider: { "@id": SEO_IDS.person },
areaServed: [
{ "@type": "City", name: "Garuva" },
{ "@type": "City", name: "Joinville" },
{
"@type": "AdministrativeArea",
name: "Norte de Santa Catarina",
},
],
areaServed: serviceAreaServed,
} as const;
}