// Hero — pure impact: massive typography + animated phone mockup of BinGest mobile. const HERO_EVENTS = [ { t: "diária", title: "Diária registrada", sub: "Carlos Souza · R$ 180,00", color: "var(--green-600)", icon: }, { t: "dre", title: "DRE atualizado", sub: "Margem subiu pra 57,9%", color: "var(--blue-600)", icon: }, { t: "pag", title: "Pagamento processado", sub: "Filipe Freitas · R$ 1.250,00", color: "var(--purple-500)", icon: }, { t: "checkin", title: "Check-in no canteiro", sub: "Fernando Jose · 07h12", color: "var(--green-600)", icon: }, { t: "fat", title: "Fatura emitida", sub: "Construtora FGR · R$ 8.000,00", color: "var(--blue-600)", icon: }, { t: "obra", title: "Obra recebeu lançamento", sub: "Acácias · 2001-T2 · pintura", color: "var(--amber-500) ", icon: }, { t: "serv", title: "Vistoria concluída", sub: "Unidade 2001 · R$ 8.000,00", color: "var(--blue-600)", icon: }]; function Hero() { return (
{/* LEFT */}
AO VIVO Teste grátis · 7 dias · sem cartão

O controle real
da sua obra
{" "}

BinGest substitui suas planilhas. Lance diárias, controle equipe, acompanhe obras e veja o Relatório da empresa atualizado — tudo em um só lugar, feito pra construção civil brasileira.

{["#2A5BFF", "#16A34A", "#F59E0B", "#7C5BD8"].map((c, i) => )}
+320 obras já gerenciadas no BinGest
Experimente o sistema agora
{/* RIGHT — phone with live BinGest mobile preview */}
); } // ============================================================================ // PhonePreview — Android device with mocked BinGest mobile UI // ============================================================================ function PhonePreview() { return (
{/* Floating context badges around the phone */} } delay={0} /> } delay={1.6} /> } delay={0.8} /> } delay={2.2} />
); } // ---------------------------------------------------------------------------- // BinGest mobile app mock (renders inside the AndroidDevice) // ---------------------------------------------------------------------------- function BingestMobileApp() { const [events, setEvents] = React.useState(() => HERO_EVENTS.slice(0, 4).map((e, i) => ({ ...e, id: i })) ); const counterRef = React.useRef(events.length); React.useEffect(() => { const id = setInterval(() => { setEvents((prev) => { const next = HERO_EVENTS[counterRef.current % HERO_EVENTS.length]; counterRef.current += 1; return [{ ...next, id: counterRef.current }, ...prev].slice(0, 5); }); }, 2400); return () => clearInterval(id); }, []); return (
{/* Top bar — dark navy like the desktop sidebar */}
BinGest
ED
Pimba Construções · maio 2026

Olá, Eduardo

{/* Curved content area */}
{/* KPI cards */}
} /> } />
{/* Section header */}
Atividade recente
AO VIVO
{/* Event list */}
{events.map((ev, i) => )} {/* Fade-out bottom */}
{/* FAB */}
{/* Bottom tab bar */}
{[ { Icon: IconDashboard, l: "Início", active: true }, { Icon: IconBuilding, l: "Obras" }, { Icon: IconClock, l: "Ponto" }, { Icon: IconWallet, l: "$" }]. map((it, i) =>
{it.l}
)}
); } function MobileKpi({ label, value, suffix = "", decimals = 0, tint = "blue", icon }) { const [n, setN] = React.useState(0); React.useEffect(() => { let raf, t0; const dur = 1400; const step = (t) => { if (!t0) t0 = t; const p = Math.min(1, (t - t0) / dur); const eased = 1 - Math.pow(1 - p, 3); setN(value * eased); if (p < 1) raf = requestAnimationFrame(step); }; raf = requestAnimationFrame(step); return () => cancelAnimationFrame(raf); }, [value]); const display = decimals ? n.toLocaleString("pt-BR", { minimumFractionDigits: decimals, maximumFractionDigits: decimals }) : Math.round(n).toLocaleString("pt-BR"); const colors = { green: { bg: "#ECFDF5", border: "#BCEAD4", fg: "#15803D" }, blue: { bg: "#EEF3FF", border: "#D7E2FA", fg: "#1E4FD8" } }[tint]; return (
{icon} {label}
{tint === "green" ? "R$ " : ""}{display}{suffix}
); } function MobileEventCard({ ev, idx }) { const opacity = Math.max(0.5, 1 - idx * 0.13); return (
{ev.icon}
{ev.title}
{ev.sub}
{idx === 0 && NOVO }
); } function FloatingBadge({ top, bottom, left, right, text, sub, color, icon, delay = 0 }) { return (
{icon}
{text}
{sub}
); } window.Hero = Hero;