import type { Metadata } from "next"; import { Breadcrumb } from "@/app/components/Breadcrumb"; import { pageTop, primaryButton, secondaryButtonDark, secondaryButtonLight, textLink, } from "@/app/components/button-styles"; import HoverPrefetchLink from "@/app/components/HoverPrefetchLink"; import { PagePiece } from "@/app/components/PagePiece"; import WhatsAppLink from "@/app/components/WhatsAppLink"; import { safeJsonLd } from "@/lib/jsonld"; import { buildBreadcrumbList, buildPageSocialMetadata } from "@/lib/seo"; import { buttonLabels, type CaseStudyContent, clientCasesForListing, labCases, siteUrl, } from "@/lib/site-content"; import { CASES_SUBJECT } from "@/lib/whatsapp"; import { CaseCoverLink } from "./_components/CaseCoverLink"; import { compactHero, heroWithMediaGrid } from "./_components/hero-styles"; const pageUrl = `${siteUrl}/cases`; const pageTitle = "Cases: sites e sistemas para empresas"; const pageDescription = "Cases de sites e sistemas para empresas: loja virtual com pedido pelo WhatsApp, site com painel para o dono e páginas institucionais."; /** Abertura da página: o que o visitante encontra nos cases, sem repetir a frase do título. */ const pageLead = "Abra um case para ver o problema do cliente, o que foi feito e como o site ficou, da loja virtual ao site que o dono edita sozinho."; const allCases = [...clientCasesForListing, ...labCases]; export const metadata: Metadata = { title: pageTitle, description: pageDescription, ...buildPageSocialMetadata({ url: pageUrl, title: pageTitle, description: pageDescription, type: "website", }), }; /** * Cartão de um case de cliente, com a capa do site (quando há captura gravada), o resumo e o botão do case. * `wide`: o cartão que sobraria sozinho na última linha ocupa a linha inteira, capa à esquerda e texto à direita. */ function ClientCaseCard({ caseStudy, priority = false, wide = false, }: { caseStudy: CaseStudyContent; /** Capa que abre a página: sem mosaico no topo, a primeira capa é a maior imagem visível. */ priority?: boolean; wide?: boolean; }) { return (
:first-child]:mb-0" : "" }`} >
{caseStudy.title}

{caseStudy.headline}

{caseStudy.summary}

{buttonLabels.case} {caseStudy.title} {caseStudy.demoUrl ? ( {buttonLabels.site} {caseStudy.title} ) : null}
); } /** * Uma linha por projeto do laboratório: nome, o que é, a marca "Projeto próprio" e o link. Sem capa nem resumo, para a lista * ocupar pouco espaço (no celular, o nome e a marca ficam na primeira linha). */ function LabCaseRow({ caseStudy }: { caseStudy: CaseStudyContent }) { return (
  • {caseStudy.title}

    Projeto próprio

    {caseStudy.subtitle}

    {buttonLabels.case} {caseStudy.title}
  • ); } export default function CasesPage() { const jsonLd = { "@context": "https://schema.org", "@graph": [ { "@type": "CollectionPage", "@id": `${pageUrl}#page`, name: pageTitle, url: pageUrl, description: pageDescription, }, { "@type": "ItemList", itemListElement: allCases.map((caseStudy, index) => ({ "@type": "ListItem", position: index + 1, name: caseStudy.title, url: `${pageUrl}/${caseStudy.id}`, })), }, buildBreadcrumbList(pageUrl, [ ["Início", siteUrl], ["Cases", pageUrl], ] as const), ], }; return (
    {/* sem mosaico de pôsteres: os cartões logo abaixo já trazem a capa de cada cliente, e a mesma imagem não aparece duas vezes */}

    Veja o que já fiz para empresas.

    {pageLead}

    Projetos de clientes

    {clientCasesForListing.map((caseStudy, index, all) => ( ))}

    Laboratório

    Projetos pessoais e de estudo, feitos para praticar e testar ideias.

      {labCases.map((caseStudy) => ( ))}

    Quer um projeto parecido com algum destes?

    Conte o que você precisa. A conversa começa pelo WhatsApp, sem formulário.

    {buttonLabels.whatsapp} {buttonLabels.allServices}
    ); }