// 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 ( } >
{/* Filters */}
{['todos', 'ativa', 'agendada', 'rascunho', 'concluida'].map(s => ( ))}
{filtered.length} campanhas · ordenadas por relevância
{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 ( ); })}
Campanha Canal Status Agendamento Enviados Abertura Clique Conv. Receita Ações
{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 ?
{clkPct.toFixed(1)}%
: }
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 ( } > {/* Stepper */}
{steps.map((s, i) => { const active = step === s.id, done = step > s.id; return {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 => ( ))}
} {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 ( ); })}
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 => ( ))}
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 &&
Nome da campanha (interno)
setNome(e.target.value)} className="inp-mkt"/>
Assunto do e-mail
setAssunto(e.target.value)} className="inp-mkt"/>
{assunto.length}/60 caracteres Spam score: baixo Sugerir com IA
Preheader (preview na caixa)
setPreheader(e.target.value)} className="inp-mkt"/>
Template base
{['Oferta', 'Newsletter', 'Limpo', 'Produto'].map((t, i) => ( ))}
} {(step === 5 || step === 6) &&
{step === 5 && <>
Data
Horário
Otimização inteligente
} {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.
}
}
{/* Right: preview */}
); }; const CampaignPreview = ({ canal, assunto, preheader }) => { const [device, setDevice] = React.useState('mobile'); return (
Preview ao vivo
{['mobile', 'desktop'].map(d => ( ))}
{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.
Resgatar agora →
⏰ 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 ✓✓
); 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 ( } >
{['todos', 'promocional', 'engajamento', 'transacional', 'onboarding', 'retencao', 'pesquisa', 'sazonal'].map(c => ( ))}
{filtered.map(t => (
setEditor(true)}> {/* Thumb */}
{t.icon}
{t.cat}
{/* Fake email chrome */}
{t.nome}
{t.uses} usos {t.updated}
))}
); }; 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 */}
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' &&
PA
Padaria Automatiza
} {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' &&
Resgatar agora →
} {b.type === 'footer' &&
Padaria Automatiza · BH/MG
Descadastrar
}
))}
{/* Properties */}
Propriedades do bloco
{selectedBlock &&
Texto principal