/* global React */
/* =====================================================
Digital Valor — Visual modules
- HeroDashboard: aquisição & vendas dashboard
- FlowDiagram: campanhas → otimização
- EDVADiagram: 4 pilares conectados
- MiniFunnel: visitante → otimização
===================================================== */
const { useState, useEffect } = React;
/* ---------- Helper: count-up number ---------- */
function CountUp({ value, suffix = "", prefix = "", duration = 1200 }) {
const [n, setN] = useState(0);
useEffect(() => {
let raf;
const start = performance.now();
const tick = (now) => {
const t = Math.min(1, (now - start) / duration);
const eased = 1 - Math.pow(1 - t, 3);
setN(value * eased);
if (t < 1) raf = requestAnimationFrame(tick);
};
raf = requestAnimationFrame(tick);
return () => cancelAnimationFrame(raf);
}, [value, duration]);
const fmt = Number.isInteger(value) ? Math.round(n).toLocaleString("pt-BR") : n.toFixed(1).replace(".", ",");
return {prefix}{fmt}{suffix};
}
/* ---------- Hero Dashboard ---------- */
function HeroDashboard() {
const months = ["Jan", "Fev", "Mar", "Abr", "Mai", "Jun", "Jul", "Ago"];
// pairs of [oportunidades, vendas]
const data = [
[42, 16], [55, 22], [68, 28], [74, 32],
[82, 38], [95, 44], [110, 52], [124, 61],
];
const maxV = 130;
return (
Painel · Aquisição e Vendas
Mês
Trimestre
Ano
Oportunidades
↑ 28% vs período anterior
Em atendimento
↑ 14% follow-up ativo
Conversão comercial
↑ 6,2 p.p. ajuste de funil
Funil mensal · oportunidades vs vendas fechadas
Oportunidades
Vendas
{data.map(([o, v], i) => (
))}
{months.map(m => {m})}
EEstrutura
DDemanda
VVendas
AAceleração
Dados em tempo real
Atualizado há 4 min
);
}
/* ---------- Flow diagram (Tese section) ---------- */
function FlowDiagram() {
const steps = [
{ name: "Campanhas", icon: "spark" },
{ name: "Oportunidades", icon: "leads" },
{ name: "Atendimento", icon: "chat" },
{ name: "Conversão", icon: "check" },
{ name: "Dados", icon: "data" },
{ name: "Otimização", icon: "tune" },
];
return (
{steps.map((s, i) => (
{String(i + 1).padStart(2, "0")}
{s.name}
{i < steps.length - 1 &&
→}
))}
);
}
function FlowIcon({ name }) {
const common = { width: 28, height: 28, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 1.6, strokeLinecap: "round", strokeLinejoin: "round" };
const color = { color: "var(--dv-green)" };
if (name === "spark") return ;
if (name === "leads") return ;
if (name === "chat") return ;
if (name === "check") return ;
if (name === "data") return ;
if (name === "tune") return ;
return null;
}
/* ---------- EDVA Diagram ---------- */
function EDVADiagram() {
const tiles = [
{ L: "E", name: "Estrutura", step: "Etapa 01", body: "Organizamos a base: funil, canais, CRM, WhatsApp comercial, indicadores e processo de acompanhamento." },
{ L: "D", name: "Demanda", step: "Etapa 02", body: "Ativamos campanhas, criativos e canais digitais para gerar novas oportunidades comerciais." },
{ L: "V", name: "Vendas", step: "Etapa 03", body: "Ajustamos o processo de atendimento, follow-up e conversão para que mais interessados avancem até a compra." },
{ L: "A", name: "Aceleração", step: "Etapa 04", body: "Analisamos dados, identificamos gargalos e otimizamos campanhas, funil e comercial continuamente." },
];
return (
{tiles.map((t, i) => (
{t.L}
{t.body}
{i < tiles.length - 1 &&
}
))}
→ Quando marketing e vendas trabalham como sistema, a empresa ganha previsibilidade.
);
}
/* ---------- Mini Funnel ---------- */
function MiniFunnel() {
const steps = [
{ label: "Visitante", v: "100%" },
{ label: "Lead", v: "42%" },
{ label: "Atendimento", v: "31%" },
{ label: "Proposta", v: "18%" },
{ label: "Venda", v: "9%" },
];
return (
Funil de aquisição
conversão por etapa
{steps.map((s, i) => (
{String(i + 1).padStart(2, "0")}
{s.label}
{s.v}
))}
↺
Otimização contínua sobre os dados do funil
);
}
Object.assign(window, { HeroDashboard, FlowDiagram, EDVADiagram, MiniFunnel, CountUp });