"use client"; import Link from "next/link"; import { type CSSProperties, Fragment } from "react"; import { trackEmailClick, trackSocialClick } from "@/lib/analytics"; import { CONTACT_EMAIL, LINKEDIN_URL } from "@/lib/site-navigation"; import ClientStrip, { type ClientLink } from "./ClientStrip"; import HeroField from "./cinematic/HeroField"; import { HERO_CTA_ID } from "./FloatingWhatsApp"; import HeroWork, { type HeroWorkUrl } from "./HeroWork"; const SOCIAL_LINKS = [ { href: LINKEDIN_URL, label: "LinkedIn", onClick: () => trackSocialClick({ network: "linkedin" }), }, { href: `mailto:${CONTACT_EMAIL}`, label: "Email", onClick: () => trackEmailClick({ placement: "hero" }), }, ]; /** * Números reais, calculados em app/page.tsx (nada digitado à mão): os anos vêm de public/portfolio-data.json. */ export type HeroStats = { years?: number; }; type StatItem = { value: string; label: string; }; function statItems(stats?: HeroStats): StatItem[] { if (!stats?.years) return []; return [{ value: String(stats.years), label: "anos de experiência" }]; } /** Título em palavras para a entrada em cascata; o texto segue inteiro para leitores de tela e buscadores. */ const TITLE = "Sistemas sob medida para operações que não cabem em soluções prontas.".split( " ", ); const ACCENT = new Set([1, 2]); /** O que cada camada da cena significa, em linguagem simples. */ const CAPTIONS = [ ["A tela", "O que sua equipe e seus clientes usam no dia a dia."], [ "As integrações", "Os programas que você já usa conversando entre si, sem retrabalho.", ], ["Os dados", "Suas informações guardadas, organizadas e seguras."], ] as const; export default function Hero({ stats, clients, workUrl, }: { stats?: HeroStats; clients?: ClientLink[]; /** Endereço mostrado na barra do navegador de HeroWork (o do site da Lavação 047). */ workUrl?: HeroWorkUrl; }) { const items = statItems(stats); return (
); }