import Image from "next/image"; import { getShowcaseAssets } from "@/lib/project-showcase"; import { primaryButton, textLink } from "./button-styles"; import ContactOfferLink from "./ContactOfferLink"; import type { ContactKind } from "./contact-subject"; import "./conversion.css"; import HoverPrefetchLink from "./HoverPrefetchLink"; import { Reveal } from "./Reveal"; import { Section } from "./Section"; interface Offer { id: string; title: string; description: string; /** Tipo de projeto que o botão deixa marcado no formulário de contato. */ kind: ContactKind; ctaLabel: string; /** Case cujo pôster ilustra a oferta; sem ele, a miniatura é o cartão de checklist. */ project?: { id: string; title: string }; moreLabel: string; moreHref: string; } /** * As três ofertas da home, na ordem do H1: site que traz pedidos, sistema que tira a operação da planilha e revisão * de sistema que já existe. Cada texto só diz o que o case ou a página de /ia citados já sustentam; sem prazo nem preço. */ const OFFERS: Offer[] = [ { id: "site", title: "Site que traz pedidos pelo WhatsApp", description: "Catálogo ou tabela de preços, mensagem pronta no WhatsApp e um painel para você editar preços, textos e fotos sozinho, como na Lavação 047.", kind: "site", ctaLabel: "Começar pelo site", project: { id: "lavacao-047", title: "Lavação 047" }, moreLabel: "Ver o case Lavação 047", moreHref: "/cases/lavacao-047", }, { id: "sistema", title: "Sistema para tirar a operação da planilha", description: "Pedidos, estoque e rotinas que hoje vivem em planilhas e mensagens passam para um painel próprio, feito para a sua equipe. Um exemplo é a SEV Moda Íntima, com cadastro de peças, pedidos e estoque por tamanho.", kind: "sistema", ctaLabel: "Começar pelo sistema", project: { id: "sev-modaintima", title: "SEV Moda Íntima" }, moreLabel: "Ver o case SEV Moda Íntima", moreHref: "/cases/sev-modaintima", }, { id: "revisao", title: "Revisão de sistema que já existe, inclusive feito com IA", description: "Avalio o que já existe, testo as falhas de acesso a dados e separo o que dá para aproveitar do que é melhor refazer, antes de o sistema receber mais clientes.", kind: "revisao", ctaLabel: "Começar pela revisão", moreLabel: "Ver como funciona a revisão", moreHref: "/ia", }, ]; /** O que a revisão entrega: os mesmos itens da página /ia, em versão curta para a miniatura da oferta. */ const REVIEW_CHECKLIST = [ "As falhas de acesso a dados", "O que dá para aproveitar", "O que é melhor refazer", "Um orçamento para pôr em produção", ]; const PROCESS = [ { title: "Entender a operação", description: "Quem usa, qual problema precisa resolver e quais dados e ferramentas já existem.", }, { title: "Definir a entrega", description: "Escopo, arquitetura, riscos, investimento e critérios de aceite antes de desenvolver.", }, { title: "Construir e validar", description: "Entregas por etapa, demonstrações e testes dos fluxos, das permissões e das integrações.", }, { title: "Publicar e dar continuidade", description: "Implantação, documentação e condições de manutenção combinadas para a operação.", }, ]; /** Miniatura da revisão, sem case para mostrar: o que o relatório traz, em um cartão escuro do mesmo tamanho dos pôsteres. */ function ReviewChecklist() { return (

O que você recebe

); } /** Um único estilo de cartão para as três ofertas: miniatura, título com altura mínima, texto, botão e link do case. */ function OfferCard({ offer }: Readonly<{ offer: Offer }>) { const poster = offer.project ? getShowcaseAssets(offer.project.id, "desktop") : null; return (
{poster && offer.project ? ( {`Site ) : ( )}
{/* min-h de 3 linhas no desktop: os títulos de 2 e 3 linhas terminam na mesma altura e os textos se alinham */}

{offer.title}

{offer.description}

{offer.ctaLabel} {offer.moreLabel}
); } export function WorkModalities() { return (
{OFFERS.map((offer, index) => ( ))}
{/* Lista compacta: o título e a descrição de cada etapa numa linha só, sem a grade de quatro cartões. */}

Como eu trabalho

Você acompanha as decisões e valida cada etapa. Prazo e investimento dependem do escopo, das integrações e dos riscos identificados.

    {PROCESS.map((step, index) => (
  1. {String(index + 1).padStart(2, "0")}

    {step.title}. {" "} {step.description}

  2. ))}
); }