// ============================================================================ // Página de Playbooks de Vendas // ============================================================================ function PagePlaybooks({ open }) { const [active, setActive] = useState('todos'); const filters = [ { id: 'todos', label: 'Todos os playbooks', count: PLAYBOOKS.length }, { id: 'investimento', label: 'Usinas de Investimento' }, { id: 'assinatura', label: 'Energia por Assinatura' }, { id: 'convencional', label: 'Sistemas Convencionais' }, { id: 'arrendamento', label: 'Arrendamento' }, { id: 'bess', label: 'BESS · Armazenamento' }, ]; const list = active === 'todos' ? PLAYBOOKS : PLAYBOOKS.filter(p => p.pal === active); return (
Playbooks comerciais vivos, por produto.} sub="Cada playbook traz a jornada comercial, diagnóstico, argumentos, diferenciais Ampexx, objeções e roteiro de apresentação. Use durante a reunião e mantenha sincronizado com o time." cta={[{ label: 'Como propor um novo playbook', kind: 'ghost' }, { label: 'Modelo padrão de playbook', kind: 'primary' }]} />
{filters.map(f => ( ))}
Ordenar: Mais atualizados
{list.map(p => )}
); } // ============================================================================ // Card vertical estilo "G4 pílulas" — mas com ilustração própria por produto // ============================================================================ function PlaybookCard({ p, open }) { const pal = PRODUCT_PALETTES[p.pal]; const isDark = pal.ink === '#fff'; return ( open && open(p)} style={{ overflow: 'hidden', border: 'none', background: 'transparent', padding: 0, }}>
{p.code}
Playbook de Vendas

{p.title}

{p.subtitle}
{p.sections} capítulos· {p.duration}· Atualizado {p.updated}
{/* rodapé com info de manutenção */}
{p.owner}
); } function StatusPill({ status, dark }) { const m = { 'Atualizado': { bg: 'rgba(47,107,79,.22)', fg: '#9CC9B0' }, 'Novo': { bg: 'rgba(232,155,44,.22)', fg: '#F0B656' }, 'Revisão': { bg: 'rgba(184,83,51,.22)', fg: '#F3A88B' }, 'Rascunho': { bg: 'rgba(255,255,255,.12)', fg: dark ? 'rgba(255,255,255,.75)' : 'var(--ink-3)' }, }[status] || { bg: 'rgba(0,0,0,.08)', fg: dark ? '#fff' : 'var(--ink-2)' }; if (!dark) { // versão sobre fundo claro const light = { 'Atualizado': { bg: 'rgba(47,107,79,.14)', fg: '#1F4F37' }, 'Novo': { bg: 'rgba(232,155,44,.18)', fg: '#8A560A' }, 'Revisão': { bg: 'rgba(184,83,51,.16)', fg: '#7B341A' }, 'Rascunho': { bg: 'rgba(14,31,56,.08)', fg: 'var(--navy)' }, }[status] || m; return {status}; } return {status}; } // Ilustração por playbook — geométrica, original function PlaybookCover({ kind, ink, accent }) { const stroke = ink === '#fff' ? 'rgba(255,255,255,.55)' : 'rgba(14,26,43,.55)'; const faint = ink === '#fff' ? 'rgba(255,255,255,.15)' : 'rgba(14,26,43,.15)'; if (kind === 'sun-grid') { return ( {/* grid base */} {[20,50,80,110,140].map(y => )} {/* arcos */} {/* "ativos" empilhados */} {[0,1,2,3,4,5,6].map(i => ( ))} ); } if (kind === 'meter') { return ( {/* medidor */} {/* seta indicando economia */} - 22% ); } if (kind === 'panel') { return ( {/* painéis solares em perspectiva */} {[0,1,2,3].map(r => )} {[0,1,2,3,4].map(c => )} ); } if (kind === 'handshake') { return ( {/* duas formas se encontrando */} ); } if (kind === 'battery') { return ( ); } return null; } // ============================================================================ // Banner com processo padrão de criação // ============================================================================ function PlaybookProcessBanner() { const steps = [ { n: '01', t: 'Objetivo' }, { n: '02', t: 'Visão Geral' }, { n: '03', t: 'Público-alvo' }, { n: '04', t: 'Jornada' }, { n: '05', t: 'Diagnóstico' }, { n: '06', t: 'Argumentos' }, { n: '07', t: 'Diferenciais' }, { n: '08', t: 'Objeções' }, { n: '09', t: 'Roteiro' }, { n: '10', t: 'Qualificação' }, { n: '11', t: 'Próximos passos' }, { n: '12', t: 'FAQ' }, ]; return (
Padrão Ampexx

Estrutura padrão de um playbook

Todo playbook publicado no portal segue exatamente esses 12 blocos. Antes de propor um novo playbook, valide o esqueleto com a coordenação comercial.

{steps.map(s => (
{s.n}
{s.t}
))}
); } // ---- Header padrão de página ----------------------------------------------- function PageHeader({ eyebrow, title, sub, cta }) { return (
{eyebrow}

{title}

{sub &&

{sub}

}
{cta && (
{cta.map((c, i) => ( ))}
)}
); } Object.assign(window, { PagePlaybooks, PageHeader, PlaybookCard, PlaybookCover, StatusPill });