);
}
// ── Marquee "vida de vendedor" ───────────────────────────────
function VendedorTicker() {
const frases = [
'Bateu a meta? Bebe uma.',
'Vendi! E agora? Já caiu na conta.',
'Cliente sumiu há 3 dias. Vai um WhatsApp?',
'Tua comissão tá ali.',
'Quanto eu ganhei hoje?',
'Hoje é dia de fechar.',
'O time bateu. Gerente paga o churrasco.',
'Sem planilha. Sem confusão.',
];
return (
);
}
// ── Strip de logos de clientes ───────────────────────────────
function CustomerStrip() {
return (
Vendedores e equipes que vendem todo dia, em todo lugar, usando Comissa.
{CUSTOMERS.map((c) => (
{c.icon && {c.icon}}
{c.n}
))}
);
}
// ── Demo animado ─────────────────────────────────────────────
function ProductDemo() {
const STEPS = [
{ k: 'create', title: 'Lance uma venda em 5 segundos', hint: '⌘K, digita "nova venda", pronto.' },
{ k: 'assign', title: 'Comissão calculada na hora', hint: 'Regras por produto, vendedor e meta. Sem planilha.' },
{ k: 'move', title: 'Bloqueie tempo pra follow-up', hint: 'Arrasta pra agenda. O Comissa lembra você.' },
{ k: 'room', title: 'Veja o time vendendo, ao vivo', hint: 'Quem fechou, quanto, agora.' },
];
const [step, setStep] = __useState(0);
const trilho = __useRef(null);
const [manual, setManual] = __useState(false);
// As etapas andam com o scroll, não com um cronômetro.
//
// Com timer de 2,8s a cena trocava sozinha enquanto o visitante ainda lia a
// etapa anterior — e trocava também quando ele nem estava olhando. Agora o
// trilho tem altura de sobra, o painel fica preso no topo e cada trecho de
// rolagem acende uma etapa: descer é o que faz o dia avançar. Clicar numa
// etapa continua funcionando e desliga o scroll até o próximo movimento.
__useEffect(() => {
if (manual) return;
const el = trilho.current; if (!el) return;
let raf = 0;
const calc = () => {
const r = el.getBoundingClientRect();
const curso = Math.max(1, r.height - window.innerHeight * 0.92);
const p = (-r.top) / curso;
const i = Math.floor(p * STEPS.length);
setStep(i < 0 ? 0 : i > STEPS.length - 1 ? STEPS.length - 1 : i);
};
const onScroll = () => { cancelAnimationFrame(raf); raf = requestAnimationFrame(calc); };
window.addEventListener('scroll', onScroll, { passive: true });
window.addEventListener('resize', onScroll);
calc();
return () => {
window.removeEventListener('scroll', onScroll);
window.removeEventListener('resize', onScroll);
cancelAnimationFrame(raf);
};
}, [manual, STEPS.length]);
// Volta pro controle por scroll no próximo movimento depois de um clique.
__useEffect(() => {
if (!manual) return;
const volta = () => setManual(false);
const t = setTimeout(() => window.addEventListener('scroll', volta, { once: true, passive: true }), 1200);
return () => { clearTimeout(t); window.removeEventListener('scroll', volta); };
}, [manual]);
return (
);
}
// Cena 1 — paleta de comando "nova venda"
function Scene_Create() {
const target = 'Rolex Submariner · Pedro Marques · R$ 78.000';
const [text, setText] = __useState('');
// A cena não acabava: digitava e ficava com a paleta aberta pra sempre, sem
// mostrar o que o Enter produz. Agora ela termina onde importa — a venda
// caindo no painel, com a comissão já calculada.
const [pronto, setPronto] = __useState(false);
__useEffect(() => {
setText(''); setPronto(false);
let i = 0;
const timers = [];
const t = setInterval(() => {
i++;
setText(target.slice(0, i));
if (i >= target.length) {
clearInterval(t);
timers.push(setTimeout(() => setPronto(true), 620));
}
}, 30);
return () => { clearInterval(t); timers.forEach(clearTimeout); };
}, []);
return (
{rows.map((r) => {
const tag = TAG_COLORS[r.tag] || TAG_COLORS.curso;
const isHi = highlight && r.id === highlight;
return (
{r.id}{r.t}{r.tag}{r.valor}
{isHi && (
)}
);
})}
);
}
// ── Ranking da equipe (era VirtualOffice) ────────────────────
function RankingEquipe() {
return (
Equipe
Quem vende mais? Todo mundo sabe.
Ranking ao vivo, comissão de cada um, progresso pra meta da equipe.
A competição saudável que faz o time vender, sem grupo de WhatsApp pra cobrar.
{[
{ i: , l: 'Metas individuais e da equipe, em tempo real' },
{ i: , l: 'Comissão de cada vendedor, transparente' },
{ i: , l: 'Bônus por meta batida, calculado automágico' },
{ i: , l: 'Visão do gerente: pipeline de todo o time' },
].map((x) => (
);
}
// ── Feature grid (em PT, niche de vendas) ────────────────────
function FeatureGrid() {
const cells = [
{
title: 'Comissão inteligente',
sub: 'Regras por produto, vendedor, faixa de meta e bônus. O Comissa calcula tudo na hora. Você só confere o número final.',
icon: ,
preview: ,
span: 2,
},
{
title: 'Lembretes que não falham',
sub: 'Cliente sumiu, follow-up agendado, comissão a cair. O Comissa cutuca você no momento certo.',
icon: ,
preview: ,
span: 1,
},
{
title: 'Integrações que importam',
sub: 'Pix, Hotmart, Kiwify, Mercado Pago, Asaas, Pagar.me. Pluga e pronto.',
icon: ,
preview: ,
span: 1,
},
{
title: 'Relatórios ao vivo',
sub: 'Gráficos, exportação pra PDF, e os números que importam pro fechamento do mês.',
icon: ,
preview: ,
span: 2,
},
];
return (
);
}
// ── Depoimentos ──────────────────────────────────────────────
function Quotes() {
const quotes = [
{
q: 'Larguei a planilha no primeiro dia. Minha comissão tava sempre uns R$ 500 errada. Agora bate certinho.',
n: 'Patrícia Almeida', r: 'Vendedora de imóveis · Habita+', hue: 8,
},
{
q: 'Os atalhos são obscenamente bons. Lanço uma venda mais rápido do que respondo no WhatsApp.',
n: 'João Vitor Souza', r: 'Vendedor de carros · Velocittà', hue: 30,
},
{
q: 'A gente vende curso, e o Comissa puxa do Hotmart direto. Comissão dos meus afiliados sai no mesmo dia.',
n: 'Eliana Ferreira', r: 'Infoprodutora · Mestria', hue: 30,
},
];
return (
{quotes.map((q, i) => (
{[0,1,2,3,4].map((s) => (
))}
“{q.q}”
x[0]).join('')} hue={q.hue} size={32} />
{q.n}
{q.r}
))}
);
}
// ── Tabela de preços compacta ────────────────────────────────
function PricingMini() {
// Os planos aqui espelham os do app (i18n.js → plan_*). Mudou lá, muda aqui.
const plans = [
{
n: 'Comissa Base', p: 'Grátis', s: 'por 14 dias', d: 'Pra começar sem custo',
f: ['Até 3 links de pagamento rastreáveis', 'Até 50 cadastros de compradores', 'Até 4 produtos cadastrados', 'Dashboard de comissões (mês atual)'],
cta: 'Começar grátis', tone: 'ghost',
onClick: () => window.openModal('signup'),
},
{
n: 'Comissa Pro', p: 'R$ 47,90', s: '/mês', d: 'Pra quem vende todo dia',
f: ['Até 25 links de pagamento rastreáveis', 'Cadastro de compradores ilimitado', 'Até 15 produtos cadastrados', 'Previsão de recebimento por plataforma', 'Histórico completo de comissões'],
cta: 'Testar 14 dias grátis', tone: 'primary', highlight: true,
onClick: () => window.openModal('signup'),
},
{
n: 'Comissa Max', p: 'R$ 97,90', s: '/mês', d: 'Pra times e operações maiores',
f: ['Links e produtos ilimitados', 'Alerta de produto parado', 'Exportação CSV/PDF', 'Suporte via WhatsApp', 'Tudo do Comissa Pro'],
cta: 'Falar com a gente', tone: 'ghost',
onClick: () => window.openModal('contact'),
},
];
return (
{plans.map((p) => (
{p.highlight && (
Mais escolhido
)}
{p.n}
{p.p}
{p.s && {p.s}}
{p.d}
{p.f.map((x) => (
{/* #A5C9FF é o azul claro pra fundo escuro — sobre o card
claro o check sumia. O acento serve os dois casos. */}
{x}
))}
))}
);
}
// ── Depois do fechamento: contrato + parcelas ────────────────
// Duas colunas. À esquerda o contrato caminhando pelos estados reais do
// produto (modelo → campos → pendência → enviado); à direita as parcelas de
// boleto baixando uma a uma.
//
// A animação é um passo a cada 2.2s, com `prefers-reduced-motion` respeitado —
// quem pediu menos movimento vê o estado final parado, não uma tela quebrada.
function PosVendaShowcase() {
// Os passos agora carregam o VALOR que entrou em cada um, não só o rótulo da
// etapa. "Campos detectados: nome · CPF · CRM" não mostra nada; ver o CRM
// sendo preenchido e o contrato travando porque faltou é o que explica o
// produto. Os placeholders saem do próprio modelo da empresa.
const PASSOS = [
{ l: 'Seu modelo, do seu jeito', d: 'contrato-clinica.docx · fonte e cláusulas intactas' },
{ l: 'Placeholders encontrados', d: '{{nome}} {{cpf}} {{crm}} {{valor}} {{data}}' },
{ l: 'Faltou o CRM da cliente', d: 'o envio trava até você completar', alerta: true },
{ l: 'Preenchido e assinado', d: 'Ana Beatriz · CRM 118.442 · há 2 min', ok: true },
];
// A lista sozinha (paga/atrasada/aberta) não dizia o que o Comissa FAZ, que
// era a reclamação. Cada linha passa a carregar a consequência, e a comissão
// aparece por parcela: é ela que o vendedor quer saber, não o status do
// boleto. `proxima` marca o cursor de próxima em aberto, que é o que a aba
// Parcelas usa de verdade no app.
// As SEIS parcelas, não quatro. O card dizia "6x" e listava 4: quem lê fica
// com a impressão de que o resto não existe ou que o Comissa perde o fio no
// meio do plano — que é justo o medo de quem vende parcelado.
const PARCELAS = [
{ n: 1, st: 'paga' },
{ n: 2, st: 'paga' },
{ n: 3, st: 'atrasada' },
{ n: 4, st: 'aberta' },
{ n: 5, st: 'aberta' },
{ n: 6, st: 'aberta' },
];
// Três frases, não quatro parágrafos. O card das parcelas já mostra o
// mecanismo; aqui ficam só as respostas que ele não consegue dar sozinho.
const COMO_FUNCIONA = [
{
t: 'A comissão segue o dinheiro',
d: 'Boleto pago, R$ 75 liberados. Nada de comissão cheia na assinatura pra ser estornada se o cliente parar no meio.',
},
{
t: 'A baixa é automática',
d: 'Quem avisa o pagamento é a plataforma de cobrança. Reenvio de webhook não paga duas vezes nem pula parcela.',
},
{
t: 'Atrasou, fica à vista',
d: 'A parcela vencida acende em vermelho, a cobrança é reenviada e a comissão dela volta no dia em que o boleto é pago.',
},
];
const [passo, setPasso] = __useState(0);
__useEffect(() => {
if (window.matchMedia('(prefers-reduced-motion: reduce)').matches) {
setPasso(PASSOS.length - 1);
return;
}
const t = setInterval(() => setPasso((v) => (v + 1) % PASSOS.length), 2200);
return () => clearInterval(t);
}, []);
const card = {
background: 'var(--surface)', border: '0.5px solid var(--line)',
borderRadius: 18, padding: 24, minHeight: 300,
};
const eyebrow = {
fontSize: 10.5, fontWeight: 600, letterSpacing: '0.08em',
textTransform: 'uppercase', color: 'var(--muted-2)', marginBottom: 18,
};
return (
{/* ── Contrato ── */}
Contrato
{PASSOS.map((p, i) => {
const feito = i <= passo;
const atual = i === passo;
const cor = p.alerta ? '#D97706' : p.ok ? '#059669' : 'var(--indigo)';
return (
{/* trilho + marcador */}
{feito && }
{i < PASSOS.length - 1 && (
)}
{p.l}
{p.d}
);
})}
O Comissa não escreve contrato. Ele lê os {'{{campos}}'} do seu modelo, puxa os dados do cliente que já
estão na venda e devolve o
seu documento pronto pra assinar. Campo obrigatório em branco segura o envio,
em vez de mandar contrato furado pro cliente.
{/* ── Parcelas ──
Era uma lista de seis linhas com data, status, nota e valor — quatro
informações por parcela, 24 no total, pra contar uma história de uma
frase. Agora são seis quadradinhos: verde pago, vermelho atrasado,
vazio a vencer. Dá pra entender o plano inteiro num relance, e o que
o vendedor quer saber (quanto já é dele) está logo abaixo em três
números. */}
Parcelas do boleto
Venda de R$ 4.500 em 6x, comissão de 10%.
Cada boleto pago libera R$ 75 pra você.
Vale pra boleto e Pix parcelado. Cartão parcelado cai inteiro pela plataforma,
então ali a comissão sai de uma vez.
{/* A explicação saiu de dentro do card e virou faixa própria: era lá que
cabiam três bullets curtos, e três bullets curtos não explicam um
mecanismo de pagamento. Aqui cabe a resposta pra pergunta que o
vendedor realmente faz — "quando esse dinheiro fica meu?". */}
Como a parcela vira comissão
Venda parcelada é comissão parcelada — e você vê cada pedaço chegando.
{COMO_FUNCIONA.map((x, i) => (
{String(i + 1).padStart(2, '0')}
{x.t}
{x.d}
))}
);
}
// ── CTA final ────────────────────────────────────────────────
function CyclingWord({ words, interval = 2400 }) {
const [i, setI] = __useState(0);
const [phase, setPhase] = __useState('in'); // 'in' | 'out'
__useEffect(() => {
const t1 = setTimeout(() => setPhase('out'), interval - 450);
const t2 = setTimeout(() => {
setI((v) => (v + 1) % words.length);
setPhase('in');
}, interval);
return () => { clearTimeout(t1); clearTimeout(t2); };
}, [i, interval, words.length]);
return (
{words[i]}
);
}
// Vídeo decorativo que só baixa/toca quando chega perto da viewport — mantém
// os ~10 MB fora do carregamento inicial (não deixa o site mais lento) e mostra
// um poster nítido enquanto o vídeo ainda não começou (paint instantâneo).
function AmbientVideo({ src, poster, style, opacity = 0.32 }) {
const ref = __useRef(null);
const [load, setLoad] = __useState(false);
__useEffect(() => {
const el = ref.current; if (!el) return;
const io = new IntersectionObserver((entries) => {
entries.forEach((e) => { if (e.isIntersecting) { setLoad(true); io.disconnect(); } });
}, { rootMargin: '300px 0px' });
io.observe(el);
return () => io.disconnect();
}, []);
// Toca assim que o primeiro frame estiver pronto — evita o play() falhar por
// ainda não ter dados (autoplay mudo é sempre permitido).
const handleReady = (e) => { const p = e.currentTarget.play(); if (p && p.catch) p.catch(() => {}); };
return (
);
}
function FinalCTA() {
const words = ['Vender.', 'Lucrar.', 'Comissar.', 'Crescer.', 'Bater meta.', 'Faturar.', 'Receber direito.'];
return (
{/* vídeo ambiente (orbe cinematográfico gerado no Higgsfield) — lazy:
só carrega quando entra na viewport, com poster nítido no lugar. */}
{/* O mesmo globo do topo fechando a página: mesmo raio grande, mesma
altura relativa. Antes ele vinha com 198 de raio numa caixa de 680 e
lia como outro gráfico, não como o planeta da abertura. Sobre fundo
escuro as linhas dos países aparecem inteiras — é onde o mapa fica
mais legível. */}
14 dias grátis, sem cartão
Pare de calcular
comissão na mão.
Comece a
Dois minutos pra configurar. Importe vendas de planilha, Hotmart, Kiwify ou Mercado Pago em um clique.
Sem cartão de crédito · Cancela quando quiser · LGPD
);
}
// ── Footer ───────────────────────────────────────────────────
function Footer() {
const top = () => window.scrollTo({ top: 0, behavior: 'smooth' });
const sec = (id) => () => window.scrollToId(id);
const cols = [
{ h: 'Produto', l: [
{ l: 'Vendas', a: top },
{ l: 'Comissões', a: top },
{ l: 'Metas', a: top },
{ l: 'Clientes', a: sec('quotes') },
// "Relatórios" apontava pra #novidades, que não existe mais. Sem seção
// própria pra ele, vai pro topo como os três primeiros — âncora morta
// rola pra lugar nenhum e parece link quebrado.
{ l: 'Relatórios', a: top },
{ l: 'Pós-venda', a: sec('pos-venda') },
]},
{ h: 'Empresa', l: [
{ l: 'Sobre', a: () => window.openModal('sobre') },
{ l: 'Manifesto', a: () => window.openModal('sobre') },
{ l: 'Clientes', a: sec('quotes') },
]},
];
return (
{[
{ i: IconCheck, t: 'Login com Face ID & senha forte', s: 'A mesma criptografia de banco. Senhas zero salvas em texto puro.' },
{ i: IconBolt, t: 'Notificação de venda na lock screen', s: 'Cliente fechou? Cai no seu Apple Watch ou Android antes mesmo do WhatsApp.' },
{ i: IconScreen, t: 'Funciona offline', s: 'Lança a venda no carro do cliente. Sincroniza quando voltar a internet.' },
].map((b) => (
{b.t}
{b.s}
))}
Toque no celular ao lado pra entrar →
Mostra como fica logo após o Face ID.
{/* centro iPhone */}
{/* botão "voltar ao login" quando estiver no app */}
{view === 'app' && (
)}
{/* Cross-fade entre as telas.
`inert` na tela apagada, além do `pointerEvents: none`: opacidade
zero esconde do olho mas NÃO tira do foco por teclado nem da
árvore de acessibilidade. Sem isso, tabulando pela página você
caía dentro do mockup e ouvia "Entrar com Google" de um
formulário de login que não existe. */}
{/* "ENTRANDO…" overlay */}
{busy && (
Autenticando com Face ID…
)}
{/* direita selos de segurança */}
{[
{ t: 'TLS 1.3', s: 'Todo tráfego criptografado ponta a ponta.' },
{ t: 'Tokens curtos', s: 'Sessão expira sozinha em inatividade.' },
{ t: '2FA opcional', s: 'TOTP, SMS ou chave de hardware.' },
{ t: 'Backup automático', s: 'Seus dados no seu time, replicados em SP & MG.' },
].map((s) => (
{s.t}
{s.s}
))}
);
}
// ── Página inteira ───────────────────────────────────────────
// ── Pra quem é — os três perfis do Comissa ──────────────────────
function PerfisSection() {
const perfis = [
{
// Ícone SVG no lugar do emoji: emoji renderiza diferente em cada SO
// (Apple, Windows e Android desenham o mesmo caractere de três jeitos),
// então nunca combina com o resto do desenho. O set de Icon* já existe
// em components.jsx e herda cor de `currentColor`.
// `perfil` é o que decide pra qual app o CTA do card manda
// (ver app-urls.js). Os três aqui são os mesmos três do modal.
perfil: 'autonomo',
cta: 'Testar como autônomo',
icon: IconBolt,
title: 'Vendedor autônomo',
sub: 'MEI, afiliado, infoprodutor. Vende no Hotmart, Kiwify, Eduzz, Braip ou Guru. Registra manual ou por link rastreável, e a venda confirmada cai direto no painel.',
chips: ['Vende um a um', 'Tráfego pago'],
bullets: [
'ROI por produto pra quem roda anúncio',
'Previsão de quando cada plataforma paga',
'Não conhece o comprador? O funil conhece.',
],
},
{
perfil: 'comissionado',
cta: 'Entrar com código da empresa',
icon: IconUsers,
title: 'Vendedor de empresa',
sub: 'Entra pelo link único que a empresa manda. Já cai vinculado à conta dela, sem cadastro chato. Vê o que é teu: a receber, pago e histórico.',
chips: ['Link único de acesso'],
bullets: [
'Comissões a receber e pagas, separadas',
'Histórico de toda venda atribuída a você',
'Sincroniza em tempo real com a empresa',
],
},
{
perfil: 'empresa',
cta: 'Abrir painel da empresa',
icon: IconLayers,
title: 'Empresa',
sub: 'O painel de quem paga: top vendedores, produtos atribuídos, comissões na ordem que você escolher, e um link de acesso pra cada vendedor do time.',
chips: ['Comissa Empresa'],
bullets: [
'Faturamento total por produto/curso',
'Filtra comissões por vendedor, valor e prazo',
'Vê na hora o que o vendedor registrou',
],
},
];
return (
{perfis.map((p) => (
{p.title}
{p.chips.map((c) => (
{c}
))}
{p.sub}
{p.bullets.map((b) => (
{b}
))}
))}
);
}
// CTA do card de perfil: leva direto pro cadastro do app daquele perfil, sem
// passar pelo modal. Quem já se reconheceu no cartão não precisa escolher
// duas vezes.
function PerfilCTA({ perfil, label }) {
const [indo, setIndo] = __useState(false);
const [hover, setHover] = __useState(false);
return (
);
}
// ── Novo no Comissa — recursos recém-lançados ───────────────────
function NovidadeMiniRow({ left, right, accent }) {
return (
{left}{right}
);
}
function NovidadesSection() {
const cards = [
{
icon: IconClock,
title: 'Previsão de recebimento',
sub: 'Cada plataforma paga num prazo. O Comissa calcula sozinho quando cada valor cai na conta e coloca no calendário.',
preview: (
),
},
{
icon: IconTarget,
title: 'Score de produto',
sub: 'Volume, ticket médio, conversão do link e tendência das últimas 2 semanas viram um score automático por produto.',
preview: (
),
},
{
icon: IconGrid,
title: 'Vagas por produto',
sub: 'Defina o limite de vagas da turma. Barra de progresso, aviso nas últimas 5 e o link fecha sozinho quando esgota, e reabre se uma venda cair.',
preview: (
),
},
{
icon: IconRoute,
title: 'Link rastreável',
sub: 'Sem acesso ao gateway? Gera teu link com nome da oferta e plataforma, e acompanha clique e conversão por oferta.',
preview: (
),
},
{
icon: IconCircle,
title: 'Cidade pelo DDD',
sub: 'O telefone do cliente vira cidade no mapa. Brasil por DDD, LATAM e Espanha por código de país. Descobre de onde a venda tá vindo.',
preview: (
),
},
{
icon: IconBolt,
title: 'Diagnóstico do dia',
sub: 'Abre o app e já sabe: quanto entrou ontem, o que vem essa semana e qual produto precisa de atenção.',
preview: (
),
},
];
// Eram 6 cards idênticos numa grade 3x2, que é o formato de "feature grid"
// que toda landing tem. Vira changelog, que é o que "saiu do forno" quer
// dizer de verdade: cada item ganha data de entrega e o primeiro ocupa duas
// colunas. A assimetria é o que tira o ar de template, e a data é o que
// transforma a lista numa prova de que o produto anda.
const MES = ['jul', 'jul', 'jul', 'jun', 'jun', 'jun'];
return (
{/* `ScrollProgress` (barra de progresso fixa no topo) removida a pedido:
era movimento constante no canto superior durante a leitura inteira,
e a página já sinaliza avanço pelos próprios blocos. O componente
segue definido acima caso se queira retomar. */}
{/* 900 era altura de tema escuro, onde o vazio ao redor do painel fazia
parte do clima. No claro esse vazio é só branco. Depois foi pra 840:
em 800 o hero cortava a própria linha de métricas no rodapé dele.
O `id="hero"` existe porque o wordmark da navegação e o do rodapé
apontam pra `#hero` — sem ele os dois eram âncoras mortas, que só
não quebravam porque o onClick chamava scrollTo por fora. */}
{/* A faixa de plataformas ("Integrações nativas" + os 12 logos) saiu a
pedido. Ela chegou a subir pro topo, entre o hero e a narrativa, e
agora não é mais chamada em lugar nenhum — `PlataformasStrip` segue
definida em narrative.jsx caso se queira retomar. */}
{/* ── Narrativa: dor → diagnóstico → virada → jornada ───────────
Os quatro blocos abaixo vêm de narrative.jsx e existem pra guiar a
leitura antes de mostrar produto: o leitor precisa reconhecer o
problema dele antes de olhar print de painel. O fundo escurece na
dor (#F1F5F9) e reacende no --bg-2 com glow índigo na virada — a
troca é sentida antes de ser lida. */}
{/* `VendedorTicker` (marquee de frases correndo) removido a pedido:
fugia do tom do resto da página. O componente segue no arquivo caso
se queira retomar. */}
{/* CustomerStrip desceu pra junto dos depoimentos, antes do preço. */}
{/* As duas interfaces — vende o produto pela cara dele, antes do tour.
A mídia de cada lado sai de APP_MEDIA (app-media.jsx). */}
{/* O subtítulo antigo enumerava os quatro passos que os cards logo
abaixo já enumeram — o leitor lia a mesma lista duas vezes e a
segunda não acrescentava nada. Agora ele carrega só o que a cena
não mostra sozinha: quando cada lado vê o número, e o que isso
elimina no dia de pagar. */}
{/* Demo */}
{/* "Ver o time vendendo ao vivo" só existe no app da empresa. Sem dizer
isso no rótulo, o vendedor autônomo assiste à demo, assina, e
descobre depois que aquela tela não é dele. Promessa que o plano não
entrega é churn no primeiro dia. */}
{/* Depois do fechamento — contrato + parcelas.
Substituiu a seção "O Comissa cabe na palma da mão" (app nativo), que
saiu porque ainda não há app pra lançar. Anotado no vault como
"Adição futura ao site". Estas duas coisas, ao contrário, já existem
no produto. */}
{/* Feature grid */}
{/* A seção "Como funciona" (FeatureGrid) saiu daqui. Ela custava 1.339px
e repetia, em card, o que a Jornada já mostra em 3 passos e o "Saiu do
forno" já detalha: comissão automática, lembrete, integração,
relatório. Terceira vez que o visitante lê a mesma promessa é onde ele
para de ler. O componente FeatureGrid segue no arquivo, caso queira
retomar em outro lugar. */}
{/* Pra quem é os três perfis */}
{/* "E na sua área / A comissão muda de nome" saiu. A intenção era boa
(perfil = COMO usa, segmento = QUAL dor traz), mas o Arthur leu a
seção e não entendeu o que ela era. Distinção que só o autor enxerga
não é distinção, é ruído: os 3 perfis logo acima já respondem "isso
é pra mim?", que é a única pergunta que esse ponto da página precisa
responder. SegmentosSection segue em narrative.jsx. */}
{/* "O que entrou este mês" saiu a pedido do Arthur. Era uma lista de
novidades num ponto da página onde o leitor já entendeu o produto e
está indo pro preço — changelog não fecha venda, e datar a página
("este mês") ainda obriga a manter a seção viva pra ela não envelhecer
sozinha. NovidadesSection segue no arquivo, é só voltar a chamar. */}
{/* O Ranking da equipe (716px) saiu. O painel da empresa na seção das
duas pontas já mostra ranking ao vivo, e ali ele prova o argumento
principal; aqui era só uma segunda vitrine da mesma coisa, num ponto
onde o visitante já devia estar indo pro preço. RankingEquipe segue
no arquivo. */}
{/* Prova social concentrada, logo antes do preço.
O CustomerStrip estava lá em cima, solto entre o marquee e as duas
interfaces, onde o Arthur achou que não fazia sentido: prova social
antes de o leitor entender o produto não convence ninguém. Junto com
os depoimentos, e imediatamente antes da tabela, ela faz o trabalho
que prova social existe pra fazer, que é derrubar a última dúvida na
hora de decidir. */}
{/* Preços */}
{/* Sem "de R$X por R$Y": ancoragem de desconto é padrão de curso.
Aqui o enquadramento é custo por dia contra o custo de errar. */}
{/* Garantia tira o risco antes de cobrar, não depois */}
{/* CTA final */}
{/* FAQ — o último bloco do site, logo antes do rodapé.
Estava antes do CTA, no meio do caminho de quem já tinha decidido:
quem chega no preço convencido não quer ler sete objeções antes de
achar o botão. Aqui ele atende quem ainda tem dúvida, sem atrapalhar
quem não tem. */}