// Wave 4a — Marketing (4 telas): Campanhas, Criador, Templates, Listas
// =============================================================
// 1. Campanhas
// =============================================================
const CAMPAIGNS = [
{ id: 1, nome: 'Black Friday 2026 — Kit Completo', canal: 'email', status: 'ativa', agendada: '14/04/2026 10:00', enviados: 8420, entregues: 8281, abertos: 3734, clicados: 912, conv: 142, receita: 28480, audiencia: 'Clientes VIP + Recuperação' },
{ id: 2, nome: 'Boas-vindas · nova padaria Savassi', canal: 'email', status: 'ativa', agendada: '10/04/2026 08:00', enviados: 1240, entregues: 1219, abertos: 671, clicados: 208, conv: 34, receita: 4210, audiencia: 'Leads Belo Horizonte' },
{ id: 3, nome: 'Aniversariantes de Abril — 15% off', canal: 'whatsapp', status: 'ativa', agendada: '01/04/2026 09:00', enviados: 184, entregues: 183, abertos: 172, clicados: 89, conv: 41, receita: 2180, audiencia: 'Aniversariantes' },
{ id: 4, nome: 'Lembrete · carrinho abandonado 48h', canal: 'email', status: 'ativa', agendada: 'Automação · contínua', enviados: 612, entregues: 601, abertos: 201, clicados: 78, conv: 22, receita: 1840, audiencia: 'Carrinho abandonado' },
{ id: 5, nome: 'NPS · pesquisa trimestral', canal: 'email', status: 'agendada', agendada: '20/04/2026 14:00', enviados: 0, entregues: 0, abertos: 0, clicados: 0, conv: 0, receita: 0, audiencia: 'Clientes ativos 90d' },
{ id: 6, nome: 'Reativação · 60 dias sem comprar', canal: 'whatsapp', status: 'rascunho', agendada: null, enviados: 0, entregues: 0, abertos: 0, clicados: 0, conv: 0, receita: 0, audiencia: 'Inativos 60d' },
{ id: 7, nome: 'Newsletter · receitas da semana', canal: 'email', status: 'pausada', agendada: '12/04/2026 07:00', enviados: 2140, entregues: 2089, abertos: 921, clicados: 187, conv: 12, receita: 680, audiencia: 'Base geral' },
{ id: 8, nome: 'Pedido confirmado · transacional', canal: 'email', status: 'ativa', agendada: 'Automação · transacional', enviados: 4210, entregues: 4198, abertos: 3802, clicados: 281, conv: 0, receita: 0, audiencia: 'Compradores' },
{ id: 9, nome: 'Páscoa 2026 · pré-venda colombas', canal: 'sms', status: 'concluida', agendada: '28/03/2026 10:00', enviados: 1820, entregues: 1810, abertos: 1629, clicados: 412, conv: 128, receita: 12400, audiencia: 'Base geral SMS' },
{ id: 10, nome: 'Cupom indicação · MGM', canal: 'email', status: 'concluida', agendada: '15/03/2026 11:00', enviados: 3240, entregues: 3198, abertos: 1182, clicados: 298, conv: 48, receita: 4820, audiencia: 'Clientes 3+ compras' },
{ id: 11, nome: 'Lançamento · Pão Francês Integral', canal: 'whatsapp', status: 'concluida', agendada: '02/03/2026 09:00', enviados: 420, entregues: 418, abertos: 398, clicados: 184, conv: 62, receita: 3120, audiencia: 'Clientes diários' },
];
const PageCampanhas = ({ onNavigate }) => {
const [filter, setFilter] = React.useState('todos');
const [canal, setCanal] = React.useState('todos');
const filtered = CAMPAIGNS.filter(c => (filter === 'todos' || c.status === filter) && (canal === 'todos' || c.canal === canal));
const canalMeta = {
email: { l: 'E-mail', c: '#93c5fd', bg: 'rgba(59,130,246,.14)', i: 'mail' },
whatsapp: { l: 'WhatsApp', c: '#86efac', bg: 'rgba(34,197,94,.14)', i: 'whatsapp' },
sms: { l: 'SMS', c: '#fbbf24', bg: 'rgba(245,158,11,.14)', i: 'phone' },
};
const statusMeta = {
ativa: { l: 'Ativa', c: '#86efac', bg: 'rgba(34,197,94,.14)' },
agendada: { l: 'Agendada', c: '#c4b5fd', bg: 'rgba(139,92,246,.14)' },
pausada: { l: 'Pausada', c: '#fcd34d', bg: 'rgba(245,158,11,.14)' },
rascunho: { l: 'Rascunho', c: 'var(--text-3)', bg: 'var(--bg-3)' },
concluida: { l: 'Concluída', c: '#93c5fd', bg: 'rgba(59,130,246,.14)' },
};
const totalEnv = filtered.reduce((t, c) => t + c.enviados, 0);
const totalAbr = filtered.reduce((t, c) => t + c.abertos, 0);
const totalClk = filtered.reduce((t, c) => t + c.clicados, 0);
const totalRec = filtered.reduce((t, c) => t + c.receita, 0);
return (
Exportar
onNavigate('criador')}> Nova campanha
>}
>
{/* Filters */}
{['todos', 'ativa', 'agendada', 'rascunho', 'concluida'].map(s => (
setFilter(s)} style={{
padding: '6px 12px', borderRadius: 7, fontSize: 12, fontWeight: 500,
background: filter === s ? 'var(--bg-3)' : 'transparent',
color: filter === s ? 'var(--text-0)' : 'var(--text-3)',
}}>{s === 'todos' ? 'Todas' : statusMeta[s]?.l || s}
))}
setCanal(e.target.value)} style={rhSelectStyle}>
Todos os canais
E-mail
WhatsApp
SMS
{filtered.length} campanhas · ordenadas por relevância
Campanha
Canal
Status
Agendamento
Enviados
Abertura
Clique
Conv.
Receita
Ações
{filtered.map(c => {
const cm = canalMeta[c.canal];
const sm = statusMeta[c.status];
const abrPct = c.enviados > 0 ? (c.abertos / c.enviados) * 100 : 0;
const clkPct = c.abertos > 0 ? (c.clicados / c.abertos) * 100 : 0;
return (
{c.nome}
{c.audiencia}
{cm.l}
{sm.l}
{c.agendada || — }
{c.enviados.toLocaleString('pt-BR')}
{c.enviados > 0 ?
25 ? '#22c55e' : abrPct > 15 ? '#f59e0b' : '#ef4444' }}/>
{abrPct.toFixed(1)}%
:
— }
{c.abertos > 0 ? : — }
0 ? '#86efac' : 'var(--text-4)' }}>{c.conv || '—'}
0 ? 'var(--text-0)' : 'var(--text-4)' }}>{c.receita > 0 ? BRL(c.receita) : '—'}
);
})}
);
};
// =============================================================
// 2. Criador (Campaign Builder Wizard)
// =============================================================
const PageCriador = ({ onNavigate }) => {
const [step, setStep] = React.useState(3);
const [nome, setNome] = React.useState('Black Friday 2026 — Kit Completo');
const [objetivo, setObjetivo] = React.useState('vendas');
const [canal, setCanal] = React.useState('email');
const [audiencia, setAudiencia] = React.useState(['vip', 'recup']);
const [assunto, setAssunto] = React.useState('🔥 Última chance: 30% OFF em todo o kit gourmet');
const [preheader, setPreheader] = React.useState('Termina à meia-noite. Seu cupom já está reservado.');
const steps = [
{ id: 1, l: 'Objetivo', i: 'target' },
{ id: 2, l: 'Audiência', i: 'users' },
{ id: 3, l: 'Canal', i: 'megaphone' },
{ id: 4, l: 'Conteúdo', i: 'edit' },
{ id: 5, l: 'Agendar', i: 'calendar' },
{ id: 6, l: 'Revisar', i: 'check' },
];
return (
Salvar rascunho
Preview PDF
Agendar disparo
>}
>
{/* Stepper */}
{steps.map((s, i) => {
const active = step === s.id, done = step > s.id;
return
setStep(s.id)} style={{
display: 'flex', alignItems: 'center', gap: 10, padding: '6px 10px', borderRadius: 9,
background: active ? 'var(--accent-soft-14)' : 'transparent',
border: active ? '1px solid var(--accent-soft-40)' : '1px solid transparent',
}}>
{done ? : s.id}
{i < steps.length - 1 &&
}
;
})}
{/* Left: step content */}
{steps.find(s => s.id === step).l}
{
step === 1 ? 'Qual o objetivo principal desta campanha?' :
step === 2 ? 'Escolha segmentos de clientes que irão receber.' :
step === 3 ? 'Por qual canal enviar a mensagem?' :
step === 4 ? 'Monte o conteúdo · assunto, preheader, corpo e CTA.' :
step === 5 ? 'Quando disparar?' : 'Revise tudo antes de agendar.'
}
{step === 1 &&
{[
{ id: 'vendas', l: 'Vendas e promoções', i: 'wallet', c: '#86efac', desc: 'Ofertas, lançamentos, kits e cupons de desconto' },
{ id: 'engajamento', l: 'Engajamento', i: 'heart', c: '#f9a8d4', desc: 'Newsletter, conteúdo, receitas e novidades' },
{ id: 'retencao', l: 'Retenção', i: 'repeat', c: '#c4b5fd', desc: 'Recuperação de carrinho, reativação de inativos' },
{ id: 'transacional', l: 'Transacional', i: 'receipt', c: '#93c5fd', desc: 'Confirmação de pedido, entrega, boleto' },
{ id: 'pesquisa', l: 'Pesquisa NPS', i: 'star', c: '#fbbf24', desc: 'Coletar feedback e satisfação dos clientes' },
{ id: 'boas-vindas', l: 'Boas-vindas', i: 'sparkle', c: '#67e8f9', desc: 'Onboarding de novos cadastros e primeiros pedidos' },
].map(o => (
setObjetivo(o.id)} style={{
padding: 16, borderRadius: 12, textAlign: 'left',
background: objetivo === o.id ? 'var(--accent-soft-14)' : 'var(--bg-base)',
border: `1px solid ${objetivo === o.id ? 'var(--accent-soft-40)' : 'var(--line-1)'}`,
}}>
{o.l}
{o.desc}
))}
}
{step === 2 &&
{[
{ id: 'vip', l: 'Clientes VIP', count: 284, desc: 'LTV > R$ 1.200 · compraram nos últimos 30 dias', i: 'star', c: '#fbbf24' },
{ id: 'recup', l: 'Recuperação 30d', count: 1420, desc: 'Compraram nos últimos 90d mas não nos últimos 30', i: 'repeat', c: '#c4b5fd' },
{ id: 'aniv', l: 'Aniversariantes do mês', count: 184, desc: 'Data de nascimento em abril/2026', i: 'sparkle', c: '#f9a8d4' },
{ id: 'base', l: 'Base geral', count: 8420, desc: 'Todos contatos opt-in · engajados 180d', i: 'users', c: '#93c5fd' },
{ id: 'savassi', l: 'Proximidade Savassi', count: 640, desc: 'Geolocalização até 5km da filial Savassi', i: 'map-pin', c: '#86efac' },
].map(seg => {
const sel = audiencia.includes(seg.id);
return (
{seg.count.toLocaleString('pt-BR')}
contatos
{sel && }
);
})}
1.704 contatos únicos selecionados (sem duplicação). Previsão de alcance: 1.632 após supressão de blacklist.
}
{step === 3 &&
{[
{ id: 'email', l: 'E-mail', i: 'mail', c: '#93c5fd', custo: 'R$ 0,012', best: 'Alta taxa abertura · melhor ROI' },
{ id: 'whatsapp', l: 'WhatsApp', i: 'whatsapp', c: '#86efac', custo: 'R$ 0,18', best: 'Entrega garantida · urgência' },
{ id: 'sms', l: 'SMS', i: 'phone', c: '#fbbf24', custo: 'R$ 0,09', best: 'Lembrete rápido · 160 char' },
].map(c => (
setCanal(c.id)} style={{
padding: 20, borderRadius: 12, textAlign: 'center',
background: canal === c.id ? 'var(--accent-soft-14)' : 'var(--bg-base)',
border: `2px solid ${canal === c.id ? 'var(--accent-1)' : 'var(--line-1)'}`,
}}>
{c.l}
{c.best}
Custo: {c.custo}/envio
))}
Custo estimado: R$ 19,58 para {canal === 'email' ? '1.632 e-mails × R$ 0,012' : canal === 'whatsapp' ? '1.632 msgs × R$ 0,18 = R$ 293,76' : '1.632 SMS × R$ 0,09 = R$ 146,88'}
}
{step === 4 &&
Assunto do e-mail
setAssunto(e.target.value)} className="inp-mkt"/>
{assunto.length}/60 caracteres
Spam score: baixo
Sugerir com IA
Template base
{['Oferta', 'Newsletter', 'Limpo', 'Produto'].map((t, i) => (
preview
{t}
))}
}
{(step === 5 || step === 6) &&
{step === 5 && <>
Enviar agora
Dispara em até 3 minutos
Agendar disparo
Melhor horário sugerido: ter 10h
>}
{step === 6 &&
{[
['Nome', nome], ['Objetivo', 'Vendas e promoções'],
['Canal', 'E-mail'], ['Audiência', '2 segmentos · 1.704 contatos'],
['Assunto', assunto], ['Agendamento', '22/04/2026 · 10:00'],
['Custo estimado', 'R$ 19,58'], ['Receita projetada', 'R$ 4.280 – R$ 8.120'],
].map(([k, v]) => (
{k}
{v}
))}
Tudo pronto para disparo.
}
}
setStep(Math.max(1, step - 1))} disabled={step === 1} className="btn btn-outline" style={{ opacity: step === 1 ? .4 : 1 }}>← Voltar
setStep(Math.min(6, step + 1))} className="btn btn-primary">{step === 6 ? 'Agendar disparo' : 'Avançar'} →
{/* Right: preview */}
);
};
const CampaignPreview = ({ canal, assunto, preheader }) => {
const [device, setDevice] = React.useState('mobile');
return (
Preview ao vivo
{['mobile', 'desktop'].map(d => (
setDevice(d)} style={{
padding: '5px 10px', borderRadius: 6, fontSize: 11, fontWeight: 500,
background: device === d ? 'var(--bg-1)' : 'transparent',
color: device === d ? 'var(--text-0)' : 'var(--text-3)',
}}>{d === 'mobile' ? '📱 Mobile' : '🖥️ Desktop'}
))}
{canal === 'email' && }
{canal === 'whatsapp' && }
{canal === 'sms' && }
);
};
const EmailPreview = ({ device, assunto, preheader }) => (
{/* Inbox header */}
PA
Padaria Automatiza
para você · há 2 min
{assunto}
{preheader}
{/* Hero */}
Oferta exclusiva · só hoje
30% OFF
no kit gourmet completo
{/* Body */}
Olá Ana ,
Você foi selecionada para nossa promoção mais esperada do ano. Garante o kit completo Padaria Automatiza — pães artesanais, queijos, geleias e o nosso famoso brigadeiro gourmet — com 30% de desconto exclusivo.
Use o cupom ANA30 no checkout.
⏰ Válido até 22/04 23:59 · apenas 48 resgates disponíveis
{/* Footer */}
Padaria Automatiza · Av. Cristiano Machado, 2840 · BH/MG
Descadastrar · Atualizar preferências
);
const WhatsAppPreview = () => (
PA
Padaria Automatiza
✓ Oficial · digitando...
🎂
Parabéns, Ana!
Hoje é seu aniversário! 🎉 Como presente, liberamos
15% OFF em qualquer pedido acima de R$ 50 durante toda a semana.
Use o cupom:
ANIVANA15
📍 Matriz · Filial Savassi · Delivery
10:02 ✓✓
🛒 Ver cardápio
ℹ️ Saber mais
);
const SmsPreview = () => (
Padaria · agora
Padaria Automatiza: Última chance! 30% OFF no kit gourmet só hoje. Cupom ANA30. Compre em padaria.com.br/bf R$ frete grátis acima R$80.
156/160 caracteres
);
// =============================================================
// 3. Templates
// =============================================================
const TEMPLATES = [
{ id: 1, nome: 'Black Friday · Oferta Hero', cat: 'promocional', cor: 'linear-gradient(135deg,#f59e0b,#dc2626)', icon: '🔥', uses: 8, updated: '12/04/2026', editor: 'Ana' },
{ id: 2, nome: 'Boas-vindas · simples', cat: 'onboarding', cor: 'linear-gradient(135deg,#22c55e,#0891b2)', icon: '👋', uses: 12, updated: '05/04/2026', editor: 'Patrícia' },
{ id: 3, nome: 'Newsletter · receitas da semana', cat: 'engajamento', cor: 'linear-gradient(135deg,#8b5cf6,#ec4899)', icon: '📰', uses: 24, updated: '10/04/2026', editor: 'Ana' },
{ id: 4, nome: 'Carrinho abandonado · 24h', cat: 'transacional', cor: 'linear-gradient(135deg,#3b82f6,#1e40af)', icon: '🛒', uses: 18, updated: '28/03/2026', editor: 'Sistema' },
{ id: 5, nome: 'Aniversário · cupom especial', cat: 'engajamento', cor: 'linear-gradient(135deg,#ec4899,#db2777)', icon: '🎂', uses: 16, updated: '01/04/2026', editor: 'Patrícia' },
{ id: 6, nome: 'Produto novo · lançamento', cat: 'promocional', cor: 'linear-gradient(135deg,#06b6d4,#3b82f6)', icon: '✨', uses: 6, updated: '18/03/2026', editor: 'Ana' },
{ id: 7, nome: 'NPS · pesquisa satisfação', cat: 'pesquisa', cor: 'linear-gradient(135deg,#f59e0b,#eab308)', icon: '⭐', uses: 4, updated: '20/03/2026', editor: 'Patrícia' },
{ id: 8, nome: 'Confirmação de pedido', cat: 'transacional', cor: 'linear-gradient(135deg,#10b981,#059669)', icon: '✅', uses: 4210, updated: '02/02/2026', editor: 'Sistema' },
{ id: 9, nome: 'Reativação · 60 dias', cat: 'retencao', cor: 'linear-gradient(135deg,#7c3aed,#9333ea)', icon: '💫', uses: 3, updated: '15/03/2026', editor: 'Ana' },
{ id: 10, nome: 'Promoção flash · 2h', cat: 'promocional', cor: 'linear-gradient(135deg,#ef4444,#b91c1c)', icon: '⚡', uses: 9, updated: '08/04/2026', editor: 'Ana' },
{ id: 11, nome: 'Indicação · MGM', cat: 'retencao', cor: 'linear-gradient(135deg,#0ea5e9,#0284c7)', icon: '🎁', uses: 7, updated: '12/03/2026', editor: 'Patrícia' },
{ id: 12, nome: 'Dia das Mães · especial', cat: 'sazonal', cor: 'linear-gradient(135deg,#f43f5e,#e11d48)', icon: '💐', uses: 0, updated: '14/04/2026', editor: 'Ana' },
];
const PageTemplates = ({ onNavigate }) => {
const [cat, setCat] = React.useState('todos');
const [editor, setEditor] = React.useState(false);
const filtered = TEMPLATES.filter(t => cat === 'todos' || t.cat === cat);
const catColors = {
promocional: '#ef4444', onboarding: '#22c55e', engajamento: '#8b5cf6',
transacional: '#3b82f6', pesquisa: '#f59e0b', retencao: '#7c3aed', sazonal: '#f43f5e',
};
if (editor) return setEditor(false)}/>;
return (
Importar HTML
setEditor(true)}> Novo template
>}
>
{['todos', 'promocional', 'engajamento', 'transacional', 'onboarding', 'retencao', 'pesquisa', 'sazonal'].map(c => (
setCat(c)} style={{
padding: '8px 14px', borderRadius: 999, fontSize: 12, fontWeight: 600, textTransform: 'capitalize',
background: cat === c ? 'var(--brand-gradient)' : 'var(--bg-2)',
color: cat === c ? 'white' : 'var(--text-2)',
border: `1px solid ${cat === c ? 'transparent' : 'var(--line-2)'}`,
}}>
{c === 'todos' ? 'Todos' : c}
{c === 'todos' ? TEMPLATES.length : TEMPLATES.filter(t => t.cat === c).length}
))}
{filtered.map(t => (
setEditor(true)}>
{/* Thumb */}
{t.icon}
{t.cat}
{/* Fake email chrome */}
{t.nome}
{t.uses} usos
{t.updated}
Editar
))}
);
};
const TemplateEditor = ({ onBack }) => {
const [selectedBlock, setSelectedBlock] = React.useState(1);
const blocks = [
{ type: 'header', i: 'grid' },
{ type: 'hero', i: 'megaphone' },
{ type: 'texto', i: 'edit' },
{ type: 'botao', i: 'zap' },
{ type: 'imagem', i: 'grid' },
{ type: 'divisor', i: 'menu' },
{ type: 'footer', i: 'doc' },
];
const layoutBlocks = [
{ id: 1, type: 'header', label: 'Logo + menu' },
{ id: 2, type: 'hero', label: '30% OFF · Oferta' },
{ id: 3, type: 'texto', label: 'Corpo do e-mail' },
{ id: 4, type: 'botao', label: 'Resgatar agora →' },
{ id: 5, type: 'footer', label: 'Endereço + unsubscribe' },
];
return (
{/* Blocks palette */}
← Voltar
Arraste blocos
{blocks.map(b => (
{b.type}
))}
{/* Canvas */}
{layoutBlocks.map(b => (
setSelectedBlock(b.id)} style={{
padding: b.type === 'hero' ? 0 : '18px 20px',
background: b.type === 'hero' ? 'linear-gradient(135deg,#f59e0b,#dc2626)' : b.type === 'footer' ? '#27272a' : '#fff',
color: b.type === 'hero' ? 'white' : b.type === 'footer' ? '#a1a1aa' : '#0b0c16',
borderTop: '1px solid #e4e4e7',
outline: selectedBlock === b.id ? '3px solid var(--accent-1)' : 'none',
outlineOffset: -3, cursor: 'pointer',
textAlign: b.type === 'hero' ? 'center' : 'left',
}}>
{b.type === 'header' &&
}
{b.type === 'hero' &&
oferta exclusiva
30% OFF
no kit gourmet completo
}
{b.type === 'texto' &&
Olá Ana , Você foi selecionada para nossa promoção mais esperada do ano...
}
{b.type === 'botao' &&
}
{b.type === 'footer' &&
Padaria Automatiza · BH/MGDescadastrar
}
))}
{/* Properties */}
Propriedades do bloco
{selectedBlock &&
Cor de fundo
{['linear-gradient(135deg,#f59e0b,#dc2626)', 'linear-gradient(135deg,#22c55e,#0891b2)', 'linear-gradient(135deg,#8b5cf6,#ec4899)', '#27272a', '#f4f4f5'].map(c => (
))}
Alinhamento
{['left', 'center', 'right'].map(a => (
{a}
))}
}
);
};
// =============================================================
// 4. Listas de envio
// =============================================================
const LISTAS = [
{ id: 1, nome: 'Base geral · opt-in', fonte: 'crm', contatos: 8420, engajados: 5120, ult: '17/04/2026 · 14:22', tags: ['geral', 'opt-in'], desc: 'Todos contatos com consentimento ativo de marketing' },
{ id: 2, nome: 'VIPs LTV > R$ 1.200', fonte: 'crm', contatos: 284, engajados: 278, ult: '17/04/2026 · 14:22', tags: ['vip', 'alto-valor'], desc: 'Clientes com ticket médio e frequência acima da média' },
{ id: 3, nome: 'Leads BH formulário site', fonte: 'form', contatos: 1240, engajados: 412, ult: '14/04/2026 · 09:15', tags: ['lead', 'form'], desc: 'Formulário newsletter da landing page · último mês' },
{ id: 4, nome: 'Importação Feira Gastronômica', fonte: 'csv', contatos: 320, engajados: 48, ult: '02/04/2026 · 17:40', tags: ['evento'], desc: 'Planilha coletada no stand da Feira BH Gourmet 2026' },
{ id: 5, nome: 'Aniversariantes (dinâmica)', fonte: 'crm', contatos: 184, engajados: 172, ult: '01/04/2026 · auto', tags: ['dinâmica'], desc: 'Filtro dinâmico · atualiza diariamente · mês corrente' },
{ id: 6, nome: 'Inativos 60-90 dias', fonte: 'crm', contatos: 890, engajados: 22, ult: '15/04/2026 · auto', tags: ['inativo', 'recuperar'], desc: 'Segmentação dinâmica para campanha de reativação' },
{ id: 7, nome: 'B2B restaurantes parceiros', fonte: 'csv', contatos: 42, engajados: 38, ult: '28/03/2026 · 11:20', tags: ['b2b'], desc: 'Contatos de chefs e compradores B2B' },
{ id: 8, nome: 'Proximidade Savassi 5km', fonte: 'crm', contatos: 640, engajados: 421, ult: '17/04/2026 · auto', tags: ['geo', 'dinâmica'], desc: 'Filtro por geolocalização · CEP dos clientes' },
];
const PageListas = ({ onNavigate }) => {
const [sel, setSel] = React.useState(null);
const fonteIcon = { crm: { i: 'users', l: 'CRM', c: '#93c5fd' }, csv: { i: 'file', l: 'CSV', c: '#86efac' }, form: { i: 'edit', l: 'Formulário', c: '#c4b5fd' } };
return (
Importar CSV
Nova lista
>}
>
t + l.contatos, 0).toLocaleString('pt-BR')} sub={`${LISTAS.length} listas ativas`}/>
t + l.engajados, 0).toLocaleString('pt-BR')} sub="abertos ou clicaram"/>
l.tags.includes('dinâmica')).length} sub="atualizam sozinhas"/>
Lista
Fonte
Contatos
Engajamento
Última atualização
Tags
Ações
{LISTAS.map(l => {
const f = fonteIcon[l.fonte];
const engajPct = (l.engajados / l.contatos) * 100;
return (
setSel(l)} style={{ cursor: 'pointer' }}>
{l.nome}
{l.desc}
{f.l}
{l.contatos.toLocaleString('pt-BR')}
70 ? '#22c55e' : engajPct > 30 ? '#f59e0b' : '#ef4444' }}/>
{engajPct.toFixed(0)}%
{l.ult}
{l.tags.map(t => {t} )}
);
})}
{sel && setSel(null)}/>}
);
};
const ListaDrawer = ({ lista, onClose }) => {
const members = [
{ nome: 'Ana Carolina Silva', email: 'ana.silva@gmail.com', compras: 12, ultima: '15/04/2026', engaj: 95 },
{ nome: 'Bruno Oliveira', email: 'bruno.oli@gmail.com', compras: 8, ultima: '12/04/2026', engaj: 78 },
{ nome: 'Carolina Mendes', email: 'carol.mendes@hotmail.com', compras: 24, ultima: '10/04/2026', engaj: 98 },
{ nome: 'Diego Ferreira', email: 'diego.f@outlook.com', compras: 6, ultima: '02/04/2026', engaj: 62 },
{ nome: 'Eduardo Santos', email: 'eduardo.s@uol.com.br', compras: 15, ultima: '14/04/2026', engaj: 88 },
{ nome: 'Fernanda Costa', email: 'fer.costa@gmail.com', compras: 9, ultima: '08/04/2026', engaj: 71 },
];
return (
<>
{lista.nome}
{lista.desc}
{members.map((m, i) => (
{m.compras} compras
última {m.ultima}
80 ? '#86efac' : '#fcd34d', fontVariantNumeric: 'tabular-nums' }}>{m.engaj}
engaj
))}
Ver todos {lista.contatos.toLocaleString('pt-BR')} contatos →
>
);
};
Object.assign(window, { CAMPAIGNS, LISTAS, TEMPLATES, PageCampanhas, PageCriador, PageTemplates, PageListas });