import type { Metadata } from "next"; import { notFound } from "next/navigation"; import HeroBackground from "@/app/components/cinematic/HeroBackground"; import MagneticButton from "@/app/components/cinematic/MagneticButton"; import { safeJsonLd } from "@/lib/jsonld"; import { getRelatedCases, getServicePage, regionCities, servicePages, siteName, siteUrl, } from "@/lib/site-content"; interface ServicePageProps { params: Promise<{ slug: string; }>; } export function generateStaticParams() { return servicePages.map((service) => ({ slug: service.slug })); } export async function generateMetadata({ params, }: ServicePageProps): Promise { const { slug } = await params; const service = getServicePage(slug); if (!service) { return { title: `Serviço não encontrado`, }; } const url = `${siteUrl}/servicos/${service.slug}`; return { title: service.seoTitle, description: service.metaDescription, alternates: { canonical: url, }, openGraph: { title: service.seoTitle, description: service.metaDescription, url, siteName, type: "article", }, twitter: { card: "summary_large_image", title: service.seoTitle, description: service.metaDescription, }, }; } export default async function ServicePage({ params }: ServicePageProps) { const { slug } = await params; const service = getServicePage(slug); if (!service) { notFound(); } const relatedCases = getRelatedCases(service.relatedCaseIds); const pageUrl = `${siteUrl}/servicos/${service.slug}`; const jsonLd = { "@context": "https://schema.org", "@graph": [ { "@type": "Service", "@id": `${pageUrl}#service`, name: service.navLabel, description: service.metaDescription, serviceType: service.navLabel, provider: { "@type": "Person", name: "Evandro Fonseca Junior", url: siteUrl, }, areaServed: [ ...regionCities.map((name) => ({ "@type": "City", name })), { "@type": "AdministrativeArea", name: "Norte de Santa Catarina" }, { "@type": "Country", name: "Brasil", }, { "@type": "Place", name: "Remote worldwide", }, ], url: pageUrl, }, { "@type": "BreadcrumbList", itemListElement: [ { "@type": "ListItem", position: 1, name: "Início", item: siteUrl, }, { "@type": "ListItem", position: 2, name: "Serviços", item: `${siteUrl}/servicos`, }, { "@type": "ListItem", position: 3, name: service.navLabel, item: pageUrl, }, ], }, ], }; return (

{service.eyebrow}

{service.headline}

{service.intro}

{service.ctaLabel} Ver casos relacionados
Para quem faz sentido

Contextos em que esse serviço encaixa melhor

    {service.audience.map((item) => (
  • {item}
  • ))}
O que muda

Resultados que eu busco destravar

    {service.outcomes.map((item) => (
  • {item}
  • ))}
Como eu estruturo

Processo de trabalho

    {service.process.map((step, index) => (
  1. {index + 1} {step}
  2. ))}
Stack e repertório

Tecnologias e capacidades envolvidas

A stack entra como meio para resolver o problema certo, com critério de manutenção, observabilidade e evolução do produto.

    {service.stack.map((item) => ( {item} ))}

Casos relacionados

Projetos que reforçam esse tipo de entrega

Alguns exemplos de contexto técnico em que esse serviço se conecta a entregas reais.

{relatedCases.map((caseStudy) => (
{caseStudy.title}

{caseStudy.subtitle}

{caseStudy.summary}

{caseStudy.impact}

    {caseStudy.stack.map((item) => (
  • {item}
  • ))}
{caseStudy.demoUrl ? ( Abrir projeto ) : null} {caseStudy.githubUrl ? ( Ver código ) : null}
))}
Próximo passo

Se esse serviço parece aderente ao seu contexto, a conversa inicial já pode ser objetiva.

Traga o sistema, o gargalo e o objetivo de negócio. Eu estruturo a leitura técnica e indico o caminho mais seguro para avançar.

{service.ctaLabel} Ver todos os serviços
{service.faq && service.faq.length > 0 ? (

Dúvidas comuns

Perguntas frequentes

Respostas diretas às perguntas que costumam aparecer antes de cada projeto começar.

{service.faq.map((item) => (

{item.question}

{item.answer}

))}
) : null}
); }