// 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 */}
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}
{idx === 0 &&
NOVO
}
);
}
function FloatingBadge({ top, bottom, left, right, text, sub, color, icon, delay = 0 }) {
return (
);
}
window.Hero = Hero;