"use client"; import { motion, type Variants } from "framer-motion"; import dynamic from "next/dynamic"; import { useEffect, useState } from "react"; import { buildWhatsAppUrl, getWhatsAppDisplayNumber } from "@/lib/whatsapp"; import MagneticButton from "./cinematic/MagneticButton"; const HeroScene = dynamic(() => import("./cinematic/HeroScene"), { ssr: false, }); type HeroSceneVariant = | "command" | "launch" | "rescue" | "signal" | "diagnostic" | "portrait"; type HeroVariant = { id: string; weight: number; scene: HeroSceneVariant; layout: "default" | "visual-first" | "split" | "report" | "portrait"; status: string; chip: string; eyebrow: string; headline: string; subtitle: string; cta: string; whatsappMessage: string; sideLabel: string; sideTitle: string; sideText: string; points: string[]; proof: Array<{ label: string; value: string }>; }; const SOCIAL_LINKS = [ { href: "https://github.com/evandrodevbr", label: "GitHub", icon: ( ), }, { href: "https://www.linkedin.com/in/evandro-fonseca-junior-0969aa1b0/", label: "LinkedIn", icon: ( ), }, { href: "mailto:evandrofonsecajunior@gmail.com", label: "Email", icon: ( <> ), stroke: true, }, ]; const HERO_VARIANTS: HeroVariant[] = [ { id: "command-center", weight: 22, scene: "command", layout: "default", status: "Command center online", chip: "Sistemas em producao, sem improviso", eyebrow: "Evandro Fonseca Junior | Engenharia para produtos que precisam operar", headline: "Coloque seu sistema no ar com engenharia que nao improvisa.", subtitle: "Se voce tem um projeto travado, um MVP para lancar ou um sistema critico precisando operar melhor, agende uma conversa tecnica e saia com o proximo passo claro para producao.", cta: "Botar meu sistema no ar", whatsappMessage: "Ola! Quero colocar meu sistema no ar. Podemos conversar?", sideLabel: "Conversa tecnica pelo WhatsApp", sideTitle: "Seu projeto precisa virar sistema em producao?", sideText: "Me conte objetivo, prazo e contexto. Eu respondo com uma conversa direta para destravar arquitetura, entrega e deploy.", points: [ "Conversa tecnica para tirar o projeto do papel sem improviso.", "Arquitetura, codigo e deploy conectados ao resultado do negocio.", "Plano claro para colocar o sistema no ar com seguranca.", ], proof: [ { label: "Operacao", value: "Fluxo pensado para discovery, build, deploy e sustentacao.", }, { label: "Clareza", value: "Menos ruído entre produto, engenharia e decisao tecnica.", }, { label: "Resultado", value: "Base pronta para operar, evoluir e receber proximo ciclo.", }, ], }, { id: "launch-sequence", weight: 18, scene: "launch", layout: "visual-first", status: "Launch sequence ready", chip: "Discovery → build → deploy", eyebrow: "MVP, produto e entrega em producao", headline: "Tire seu MVP do plano e coloque em producao com base tecnica real.", subtitle: "Transformo escopo solto em sequencia de lancamento: o que validar, o que construir primeiro e como publicar sem criar uma divida tecnica logo no inicio.", cta: "Lancar meu MVP", whatsappMessage: "Ola! Quero lancar um MVP com uma base tecnica segura. Podemos conversar?", sideLabel: "Sequencia de lancamento", sideTitle: "Do primeiro corte ao deploy.", sideText: "A conversa define prioridade, risco e o menor caminho confiavel para colocar a primeira versao no ar.", points: [ "Recorte de MVP sem inflar escopo.", "Entrega incremental com criterio de producao.", "Deploy e continuidade pensados desde o inicio.", ], proof: [ { label: "01", value: "Diagnostico do objetivo e gargalo principal." }, { label: "02", value: "Plano de construcao com risco visivel." }, { label: "03", value: "Publicacao e proximo ciclo sem perder contexto." }, ], }, { id: "rescue-split", weight: 16, scene: "rescue", layout: "split", status: "Rescue mode available", chip: "Legado, instabilidade e projeto travado", eyebrow: "Rescue tecnico para sistemas que precisam voltar a andar", headline: "Codigo confuso, entrega travada ou sistema instavel? Vamos organizar.", subtitle: "Entro no ponto onde o projeto parou: leio o fluxo real, separo sintoma de causa e transformo caos tecnico em plano executavel.", cta: "Destravar meu projeto", whatsappMessage: "Ola! Tenho um projeto travado ou instavel e quero destravar. Podemos conversar?", sideLabel: "Antes / depois tecnico", sideTitle: "Do caos operacional para uma rota clara.", sideText: "O primeiro objetivo nao e reescrever tudo. E encontrar o menor corte seguro que devolve controle e previsibilidade.", points: [ "Leitura rapida de fluxo, risco e acoplamento.", "Priorizacao do que destrava sem reescrever tudo.", "Correcoes com criterio para nao trocar um bug por outro.", ], proof: [ { label: "Antes", value: "Backlog confuso, bugs recorrentes e pouca previsibilidade.", }, { label: "Intervencao", value: "Mapa de risco, cortes pequenos e decisao tecnica clara.", }, { label: "Depois", value: "Entrega volta a andar com menos improviso." }, ], }, { id: "iot-signal-map", weight: 15, scene: "signal", layout: "default", status: "Signal map active", chip: "Hardware + software + operacao", eyebrow: "Produtos conectados, telemetria e integracoes criticas", headline: "Conecte dispositivo, backend e interface em uma operacao confiavel.", subtitle: "Atuo na fronteira que costuma quebrar primeiro: sinal fisico, API, painel, dados e rotina operacional funcionando como um unico produto.", cta: "Conectar meu produto", whatsappMessage: "Ola! Quero conectar hardware, software e operacao em um produto confiavel. Podemos conversar?", sideLabel: "Mapa de sinais", sideTitle: "Dados, comandos e painel no mesmo fluxo.", sideText: "A conversa identifica fontes de dados, contratos, pontos de falha e o caminho para transformar integracao em produto.", points: [ "Contratos claros entre dispositivo, API e interface.", "Telemetria e dashboards com contexto operacional.", "Base pronta para automacao, IA ou analytics.", ], proof: [ { label: "Entrada", value: "Sensores, dispositivos, eventos ou sistemas externos.", }, { label: "Meio", value: "APIs, WebSockets, filas, banco e observabilidade.", }, { label: "Saida", value: "Painel, operacao, alerta e decisao de produto.", }, ], }, { id: "diagnostic-report", weight: 15, scene: "diagnostic", layout: "report", status: "Diagnostic report open", chip: "Arquitetura antes de mais codigo", eyebrow: "Diagnostico tecnico para decidir melhor", headline: "Antes de escrever mais codigo, descubra o proximo passo certo.", subtitle: "Quando a base cresce sem clareza, mais features podem piorar o problema. Eu ajudo a mapear risco, arquitetura e prioridades antes da proxima decisao cara.", cta: "Agendar diagnostico", whatsappMessage: "Ola! Quero um diagnostico tecnico para decidir o proximo passo do meu sistema. Podemos conversar?", sideLabel: "Relatorio tecnico", sideTitle: "Risco, arquitetura e rota de acao.", sideText: "Ideal para produto que precisa escalar, migrar, estabilizar ou parar de acumular retrabalho tecnico.", points: [ "Mapa claro dos gargalos e dependencias.", "Trade-offs traduzidos para decisao de negocio.", "Plano de transicao sem promessa magica.", ], proof: [ { label: "Risco", value: "O que pode quebrar, atrasar ou custar caro." }, { label: "Arquitetura", value: "Onde simplificar, separar ou estabilizar primeiro.", }, { label: "Acao", value: "Proximo corte de implementacao com criterio." }, ], }, { id: "cinematic-portrait", weight: 14, scene: "portrait", layout: "portrait", status: "Direct technical partner", chip: "Conversa direta com quem implementa", eyebrow: "Engenharia senior, ownership e execucao", headline: "Um parceiro tecnico para transformar complexidade em entrega.", subtitle: "Voce nao precisa apenas de tela bonita ou codigo isolado. Precisa de alguem que entenda contexto, escolha o corte certo e acompanhe ate o sistema operar.", cta: "Falar com Evandro", whatsappMessage: "Ola Evandro! Quero conversar sobre um projeto e entender como podemos colocar esse sistema no ar.", sideLabel: "Founder-led engineering", sideTitle: "Menos repasse, mais ownership.", sideText: "A conversa e comigo: contexto tecnico, prioridade, risco e caminho de entrega sem perder informacao entre camadas.", points: [ "Atendimento consultivo com leitura tecnica real.", "Do produto ao backend sem perder contexto.", "Execucao com criterio, nao so codigo por demanda.", ], proof: [ { label: "Perfil", value: "Engenharia full-stack com base em sistemas e integracoes.", }, { label: "Postura", value: "Clareza, autonomia e decisao tecnica pragmatica.", }, { label: "Acesso", value: "WhatsApp direto para conversa tecnica inicial.", }, ], }, ]; const LAYOUT_CLASSES: Record = { default: "grid items-start gap-sp-8 lg:grid-cols-[minmax(0,1.1fr)_minmax(340px,0.9fr)] lg:gap-sp-10", "visual-first": "grid items-start gap-sp-8 lg:grid-cols-[minmax(340px,0.9fr)_minmax(0,1.1fr)] lg:gap-sp-10", split: "grid items-stretch gap-sp-8 lg:grid-cols-2 lg:gap-sp-10", report: "grid items-start gap-sp-8 lg:grid-cols-[minmax(360px,0.85fr)_minmax(0,1.15fr)] lg:gap-sp-10", portrait: "grid items-center gap-sp-8 lg:grid-cols-[minmax(0,1fr)_minmax(320px,0.72fr)] lg:gap-sp-10", }; function pickWeightedHeroVariant() { const total = HERO_VARIANTS.reduce((sum, variant) => sum + variant.weight, 0); let ticket = Math.random() * total; for (const variant of HERO_VARIANTS) { ticket -= variant.weight; if (ticket <= 0) return variant; } return HERO_VARIANTS[0]; } function getGreeting(message: string) { const hour = new Date().getHours(); if (hour >= 8 && hour < 12) return `Bom dia! ${message}`; if (hour >= 13 && hour < 18) return `Boa tarde! ${message}`; return message; } function SideVisual({ variant }: { variant: HeroVariant }) { if (variant.scene === "launch") { return (
{variant.proof.map((item, index) => (
0{index + 1}
{item.label}

{item.value}

))}
); } if (variant.scene === "rescue") { return (
Antes

Bugs recorrentes, escopo nebuloso e medo de mexer.

Depois

Rota clara, cortes menores e entrega voltando a andar.

); } if (variant.scene === "signal") { return (
{[28, 150, 284, 400].map((x, index) => ( ))}
); } if (variant.scene === "diagnostic") { return (
Risk report Actionable
{variant.proof.map((item) => (
{item.label} mapped
))}
); } if (variant.scene === "portrait") { return (
EFJ
Engenharia com contato direto
); } return (
{["deploy pipeline", "api health", "production ready"].map((item) => (
{item} ok
))}
); } export default function Hero() { const [variant, setVariant] = useState(HERO_VARIANTS[0]); const [shouldReduceMotion, setShouldReduceMotion] = useState(false); const [whatsAppDisplay, setWhatsAppDisplay] = useState("WhatsApp"); useEffect(() => { setVariant(pickWeightedHeroVariant()); setShouldReduceMotion( window.matchMedia("(prefers-reduced-motion: reduce)").matches, ); setWhatsAppDisplay(getWhatsAppDisplayNumber()); }, []); const handleWhatsAppClick = () => { window.open( buildWhatsAppUrl(getGreeting(variant.whatsappMessage)), "_blank", "noopener,noreferrer", ); }; const heroContainer: Variants = { hidden: { opacity: 0 }, visible: { opacity: 1, transition: { staggerChildren: 0.1, delayChildren: 0.3 }, }, }; const easeOut: [number, number, number, number] = [0.16, 1, 0.3, 1]; const heroItem: Variants = { hidden: shouldReduceMotion ? { opacity: 0 } : { opacity: 0, y: 40, filter: "blur(10px)" }, visible: { opacity: 1, y: 0, filter: "blur(0px)", transition: { duration: 1, ease: easeOut }, }, }; const heroItemSlow: Variants = { hidden: shouldReduceMotion ? { opacity: 0 } : { opacity: 0, y: 60, filter: "blur(12px)" }, visible: { opacity: 1, y: 0, filter: "blur(0px)", transition: { duration: 1.2, ease: easeOut }, }, }; const contentOrder = variant.layout === "visual-first" || variant.layout === "report" ? "lg:order-2" : ""; const panelOrder = variant.layout === "visual-first" || variant.layout === "report" ? "lg:order-1" : ""; return (
{!shouldReduceMotion && }
{variant.status}
{variant.chip}
{variant.eyebrow} {variant.headline} {variant.subtitle} {variant.points.map((point, i) => ( {point} ))} {variant.cta} Ver casos selecionados Download CV
Garuva, SC / Brasil
Next.js, Tauri, Rust, Node.js
{SOCIAL_LINKS.map((link) => ( ))}
{variant.sideLabel}

{variant.sideTitle}

{variant.sideText}

{variant.proof.map((item, index) => (
{item.label}

{item.value}

))}
Scroll
); }