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 WhatsAppLink from "@/app/components/WhatsAppLink"; import { safeJsonLd } from "@/lib/jsonld"; import { buildBreadcrumbList, buildPageSocialMetadata } from "@/lib/seo"; import { type CaseStudyContent, clientCases, labCases, siteUrl, } from "@/lib/site-content"; import { CASES_SUBJECT } from "@/lib/whatsapp"; import { CaseCoverLink } from "./_components/CaseCoverLink"; import { compactHero, heroWithMediaGrid } from "./_components/hero-styles"; import { getMosaicPosters, PosterMosaic } from "./_components/PosterMosaic"; const pageUrl = `${siteUrl}/cases`; const pageTitle = "Cases: sites e sistemas para empresas"; const pageDescription = "Veja o que já foi feito para empresas: loja virtual com pedido pelo WhatsApp, site com painel para o dono e páginas institucionais."; const allCases = [...clientCases, ...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. */ function ClientCaseCard({ caseStudy, priority = false, }: { caseStudy: CaseStudyContent; /** Capa que abre a página: só quando não há mosaico no topo, a capa passa a ser a maior imagem visível. */ priority?: boolean; }) { return (
{caseStudy.title}

{caseStudy.headline}

{caseStudy.summary}

Ver o case {caseStudy.demoUrl ? ( Abrir o site ) : 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}

    Ver o projeto {caseStudy.title}
  • ); } export default function CasesPage() { // o mosaico mostra os outros clientes: o primeiro já aparece, com a capa, no primeiro cartão logo abaixo const posters = getMosaicPosters(clientCases.slice(1).map(({ id }) => id)); const hasMosaic = posters.length > 0; 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 (

    Trabalhos entregues

    Veja o que já fiz para empresas.

    {pageDescription}

    Projetos de clientes

    {clientCases.map((caseStudy, index) => ( ))}

    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 direto no WhatsApp, sem formulário.

    Conversar sobre meu projeto Ver os serviços
    ); }