// mobile-site.jsx — landing dedicada pra celular. // Renderizado quando window.useDevice() detecta phone. const { useState: _mss, useEffect: _mse, useRef: _msr } = React; // ── Detecção de dispositivo ────────────────────────────────── function useDevice() { const detect = () => { if (typeof window === 'undefined') return { isMobile: false, width: 1280 }; const w = window.innerWidth; const ua = navigator.userAgent || ''; const uaMobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(ua); const coarse = window.matchMedia && window.matchMedia('(pointer: coarse)').matches; const isMobile = w < 760 || (uaMobile && w < 1024) || (coarse && w < 900); return { isMobile, width: w }; }; const [d, setD] = _mss(detect); _mse(() => { const onR = () => setD(detect()); window.addEventListener('resize', onR); window.addEventListener('orientationchange', onR); return () => { window.removeEventListener('resize', onR); window.removeEventListener('orientationchange', onR); }; }, []); return d; } // ── NavBar mobile (com intro fade-down) ────────────────────── function MobileNavBar() { return (
); } // ── Notificação "venda fechada" flutuante no hero ──────────── const MOBILE_SALE_NOTIFS = [ { p: 'Curso Inglês', c: 'Camila R.', v: 'R$ 1.997', com: 'R$ 599' }, { p: 'iPhone 16 Pro', c: 'Mariana', v: 'R$ 9.499', com: 'R$ 475' }, { p: 'Rolex Submariner', c: 'Pedro M.', v: 'R$ 78.000', com: 'R$ 6.260'}, { p: 'Curso Trading', c: 'Ana Souza', v: 'R$ 1.997', com: 'R$ 599' }, { p: 'Honda Civic 2024', c: 'Vista Verde', v: 'R$ 142.000', com: 'R$ 7.100'}, ]; function MobileSaleToast() { const [i, setI] = _mss(0); const [show, setShow] = _mss(false); _mse(() => { const start = setTimeout(() => setShow(true), 3500); const cycle = setInterval(() => { setShow(false); setTimeout(() => { setI((x) => (x + 1) % MOBILE_SALE_NOTIFS.length); setShow(true); }, 350); }, 4200); return () => { clearTimeout(start); clearInterval(cycle); }; }, []); const n = MOBILE_SALE_NOTIFS[i]; return (
VENDA FECHOU · AGORA
{n.p} · {n.c}
{n.v} · comissão {n.com}
); } // ── Hero mobile (com intro animations) ─────────────────────── function MobileHero() { return (
Hotmart, Kiwify, Asaas e mais 8

Menos
planilha.
Mais{' '} comissão.

Venda por link, Pix na mão ou contrato assinado: a comissão sai pronta, com meta e follow-up no mesmo painel. Pra quem vende carro, curso, relógio qualquer coisa em que fechar é o que importa.

{/* Microcopy de risco — no mobile isso não existia, e é justamente onde o polegar para antes de tocar. Mesmas garantias do desktop. */}
14 dias grátis · sem cartão · cancela em um clique
{/* notificação flutuante "venda caiu" */}
{/* mini-stats ao vivo */}
); } // ── Stats ao vivo do hero ──────────────────────────────────── function MobileHeroStats() { const vendas = window.useDrift({ start: 4.3, min: 4.05, max: 4.62, stepMin: 0.02, stepMax: 0.08, upBias: 0.74, intervalMs: 2000, }); const minutos = window.useDrift({ start: 23, min: 22, max: 31, stepMin: 0.4, stepMax: 1.4, upBias: 0.68, intervalMs: 2400, }); const uptime = window.useDrift({ start: 99.99, min: 99.92, max: 99.999, stepMin: 0.003, stepMax: 0.014, upBias: 0.55, intervalMs: 2800, }); const stats = [ { v: vendas, ms: 1700, fmt: (n) => 'R$ ' + n.toFixed(1).replace('.', ',') + 'M', l: 'processados' }, { v: minutos, ms: 1800, fmt: (n) => Math.round(n) + ' min', l: 'economizados/dia' }, { v: uptime, ms: 2000, fmt: (n) => n.toFixed(2).replace('.', ',') + '%', l: 'uptime' }, ]; const TN = window.TweenedNumber; return (
{stats.map((s) => (
{s.l}
))}
); } // ── Marquee de frases "vida de vendedor" ───────────────────── function MobileTicker() { 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 (
{[...frases, ...frases, ...frases].map((f, i) => ( {f} ))}
); } // ── Marcas de clientes (grid 3×2) ──────────────────────────── function MobileCustomerStrip() { return (
Vendedores e equipes que vendem todo dia, em todo lugar, usando Comissa.
{CUSTOMERS.map((c) => (
{c.icon && {c.icon}} {c.n}
))}
); } // ── Face ID scan (overlay animado) ─────────────────────────── function FaceIDScan({ phase }) { // phase: 'scan' | 'done' return (
{/* moldura cantos */} {[ { top: 0, left: 0, borderTop: 2, borderLeft: 2, borderTopLeftRadius: 18 }, { top: 0, right: 0, borderTop: 2, borderRight: 2, borderTopRightRadius: 18 }, { bottom: 0, left: 0, borderBottom: 2, borderLeft: 2, borderBottomLeftRadius: 18 }, { bottom: 0, right: 0, borderBottom: 2, borderRight: 2, borderBottomRightRadius: 18 }, ].map((c, i) => ( ))} {/* ícone do rosto */} {/* linha de scan */} {phase === 'scan' && ( )} {/* check no fim */} {phase === 'done' && ( )}
{phase === 'done' ? 'AUTENTICADO' : 'OLHE PARA O IPHONE'}
); } // ── Preview views (versão limpa pro showcase) ──────────────── const PV_FONT = "'Geist', -apple-system, system-ui, sans-serif"; const PV_MONO = "'Geist Mono', ui-monospace, monospace"; function PreviewHome() { const comissao = window.useDrift({ start: 12840, min: 12700, max: 13620, stepMin: 8, stepMax: 38, upBias: 0.74, intervalMs: 2200, }); const TN = window.TweenedNumber; const META = 16000; const pct = Math.min(100, (comissao / META) * 100); const falta = Math.max(0, META - comissao); const brl = (n) => 'R$ ' + Math.round(n).toLocaleString('pt-BR'); // mini sparkline (últimos 7 dias) const spark = [120, 180, 90, 260, 200, 340, 410]; const sparkMax = Math.max(...spark); const sparkPath = spark.map((v, i) => { const x = (i / (spark.length - 1)) * 100; const y = 32 - (v / sparkMax) * 28; return `${i === 0 ? 'M' : 'L'}${x},${y}`; }).join(' '); const lastY = 32 - (spark[spark.length - 1] / sparkMax) * 28; const sales = [ { t: 'iPhone 16 Pro', c: 'Mariana R.', v: 9499, com: 475, d: 'agora', dot: '#059669' }, { t: 'Curso Trading Pro', c: 'Ana Souza', v: 1997, com: 599, d: '2h', dot: '#F59E0B' }, { t: 'Rolex Submariner', c: 'Pedro M.', v: 78000, com: 6260, d: 'hoje', dot: '#059669' }, ]; return ( {/* header */}
Olá, Marina
Bom dia
9 dias
{/* hero commission card */}
{/* glow circles */}
{/* top label row */}
COMISSÃO · MAIO
18% vs abr
{/* value + sparkline row */}
{/* progress */}
Meta R$ 16.000 Math.round(n) + '%'} />
Faltam . Tu consegue.
{/* quick stats row */}
{[ { l: 'HOJE', v: 'R$ 1.674', sub: '4 vendas', c: '#059669' }, { l: 'PIPELINE', v: '8', sub: 'em aberto', c: '#2563EB' }, { l: 'BÔNUS', v: '80%', sub: 'pra travar', c: '#F59E0B' }, ].map((s) => (
{s.l}
{s.v}
{s.sub}
))}
{/* últimas vendas */}
Últimas vendas
Ver todas ›
{sales.map((s, i) => (
{s.t}
{s.c} · {s.d}
R$ {s.v.toLocaleString('pt-BR')}
+R$ {s.com.toLocaleString('pt-BR')}
))}
); } function PreviewVendas() { const [filter, setFilter] = _mss('todas'); // status: 'pago' (caiu na conta), 'pendente' (faturado, comissão libera depois), 'analise' const sales = [ { t: 'iPhone 16 Pro', c: 'Mariana R.', v: 9499, com: 475, d: 'agora', group: 'HOJE', status: 'pago' }, { t: 'Curso Trading Pro', c: 'Ana Souza', v: 1997, com: 599, d: '2h', group: 'HOJE', status: 'pendente' }, { t: 'Rolex Submariner', c: 'Pedro Marques', v: 78000, com: 6260, d: '4h', group: 'HOJE', status: 'pendente' }, { t: 'Honda Civic 2024', c: 'Vista Verde', v: 142000, com: 7100, d: 'ontem', group: 'ONTEM', status: 'analise' }, { t: 'iPhone 15 128GB', c: 'Lucas P.', v: 6299, com: 315, d: 'ontem', group: 'ONTEM', status: 'pago' }, ]; const STATUS = { pago: { l: 'Pago', bg: 'rgba(5,150,105,0.12)', fg: '#059669', dot: '#059669' }, pendente: { l: 'Pendente', bg: 'rgba(245,158,11,0.12)', fg: '#B45309', dot: '#F59E0B' }, analise: { l: 'Em análise',bg: 'rgba(148,163,184,0.18)', fg: '#475569', dot: '#94A3B4' }, }; const filtered = sales.filter((s) => filter === 'todas' ? true : filter === 'pagas' ? s.status === 'pago' : s.status !== 'pago' ); const totalVolume = sales.reduce((a, s) => a + s.v, 0); const totalComissao = sales.reduce((a, s) => a + s.com, 0); const countPagas = sales.filter(s => s.status === 'pago').length; const countPend = sales.length - countPagas; // agrupa por dia (HOJE/ONTEM) const groups = []; filtered.forEach((s) => { const last = groups[groups.length - 1]; if (last && last.label === s.group) last.items.push(s); else groups.push({ label: s.group, items: [s] }); }); const brl = (n) => 'R$ ' + n.toLocaleString('pt-BR'); return ( {/* header */}
VENDAS · MAIO
{sales.length} vendas · {countPagas} pagas
{/* resumo do mês */}
VOLUME
{brl(totalVolume)}
em vendas
COMISSÃO
+{brl(totalComissao)}
sua parte
{/* filtros */}
{[ { k: 'todas', l: 'Todas', n: sales.length }, { k: 'pagas', l: 'Pagas', n: countPagas }, { k: 'pendentes', l: 'Pendentes', n: countPend }, ].map((f) => { const active = filter === f.k; return ( ); })}
{/* lista agrupada por dia */}
{groups.length === 0 && (
Nada por aqui ainda.
)} {groups.map((g, gi) => { const groupTotal = g.items.reduce((a, s) => a + s.com, 0); return (
{g.label}
+{brl(groupTotal)}
{g.items.map((v, i) => { const st = STATUS[v.status]; return (
{v.t}
{st.l} {v.c} · {v.d}
{brl(v.v)}
+{brl(v.com)}
); })}
); })} {/* legenda das cores */}
{[ { l: 'Pago', c: '#059669', sub: 'comissão na conta' }, { l: 'Pendente', c: '#F59E0B', sub: 'libera em 30 dias' }, { l: 'Em análise', c: '#94A3B4', sub: 'aguardando aprovar' }, ].map((x) => ( {x.l} · {x.sub} ))}
); } function PreviewMetas() { const pct = 80; const R = 88; const C = 2 * Math.PI * R; return (
Metas · maio
Faltam 11 dias
{pct}%
da meta de maio
Faltam R$ 3.160 pro bônus
Ranking do time
{[ { p: 1, n: 'Beatriz F.', v: 'R$ 18.420', hue: 30, you: false }, { p: 2, n: 'Você', v: 'R$ 12.840', hue: 14, you: true }, { p: 3, n: 'Carlos O.', v: 'R$ 11.280', hue: 30, you: false }, ].map((r, i) => (
{r.p} {r.n.split(' ').map(s => s[0]).join('').slice(0, 2)}
{r.n}
{r.v}
))}
); } function PreviewPerfil() { return (
MS
Marina Souza
Vendedora · time Velocittà
{[ { l: 'Vendas', v: '147' }, { l: 'Clientes', v: '62' }, { l: 'Streak', v: '9 d' }, ].map((s) => (
{s.v}
{s.l}
))}
{[ { i: IconGrid, l: 'Conta' }, { i: IconBolt, l: 'Notificações' }, { i: IconPix, l: 'Pagamento e Pix' }, { i: IconCircle, l: 'Ajuda' }, ].map((row, i) => (
{row.l}
))}
); } // ── App auto-tour (cicla pelas abas como um vídeo) ─────────── const M_TABS = [ { k: 'home', l: 'Início', View: PreviewHome }, { k: 'vendas', l: 'Vendas', View: PreviewVendas }, { k: 'metas', l: 'Metas', View: PreviewMetas }, { k: 'perfil', l: 'Perfil', View: PreviewPerfil }, ]; function MobileAppAutoTour() { const [idx, setIdx] = _mss(0); const [poke, setPoke] = _mss(false); const goTab = (k) => { const newIdx = M_TABS.findIndex((t) => t.k === k); if (newIdx === -1 || newIdx === idx) return; setIdx(newIdx); setPoke(true); setTimeout(() => setPoke(false), 400); }; const tab = M_TABS[idx].k; const View = M_TABS[idx].View; return (
{[ { k: 'home', l: 'Início' }, { k: 'vendas', l: 'Vendas' }, { k: 'fab', fab: true }, { k: 'metas', l: 'Metas' }, { k: 'perfil', l: 'Perfil' }, ].map((b) => ( b.fab ? ( ) : ( ) ))}
); } // ── App showcase — login interativo → Face ID → app livre ─── function MobileAppShowcase() { // 'login' (esperando clique) → 'scan' (Face ID animando) → 'app' (livre) const [stage, setStage] = _mss('login'); _mse(() => { if (stage !== 'scan') return; const t = setTimeout(() => setStage('app'), 1500); return () => clearTimeout(t); }, [stage]); const doLogin = () => { if (stage === 'login') setStage('scan'); }; const view = stage === 'app' ? 'app' : 'login'; const busy = stage === 'scan' ? 'scan' : false; return (
No bolso · iOS & Android

O Comissa cabe na palma da mão.

{stage === 'login' ? 'Toca em "Entrar" pra logar. Depois é livre pra navegar.' : 'Tá dentro. Toca onde quiser, sem roteiro, sem restrição.'}

{/* login */}
{/* app */}
{busy && }
{/* dica sutil */}
{stage === 'app' ? 'INTERATIVO · TOCA AONDE QUISER' : 'TOQUE EM ENTRAR PRA COMEÇAR'}
{/* bullets */}
{[ { i: IconCheck, t: 'Login com Face ID & senha forte', s: 'Criptografia de banco. Senha zero salva em texto puro.' }, { i: IconBolt, t: 'Notificação na lock screen', s: 'Cliente fechou? Cai no Apple Watch ou Android antes do WhatsApp.' }, { i: IconScreen, t: 'Funciona offline', s: 'Lança a venda no carro do cliente. Sincroniza depois.' }, ].map((b) => (
{b.t}
{b.s}
))}
); } // ── Features compactas ─────────────────────────────────────── function MobileFeatures() { const items = [ // Estava tudo em "tu/teu", a três telas de distância das seções que dizem // "você" — e a mesma frase existe em "você" no desktop. Não é sotaque, é a // página falando com duas pessoas diferentes. { i: IconBolt, t: 'Comissão calculada na hora', s: 'Cliente pagou? O seu valor já aparece. Sem planilha, sem dúvida, sem o gerente "esquecer".' }, { i: IconBolt, t: 'Notificação na lock screen', s: 'A venda fechou? Cai no seu celular antes do WhatsApp tocar.' }, { i: IconTarget, t: 'Meta ao vivo', s: 'Veja quanto falta pro bônus em tempo real, sem precisar conferir no fim do mês.' }, { i: IconClock, t: 'Follow-up automático', s: 'Cliente sumiu? O Comissa te lembra de mandar mensagem antes que ele esqueça de você.' }, { i: IconUsers, t: 'Time vendendo junto', s: 'Ranking ao vivo, meta da equipe, churrasco do gerente quando bate.' }, ]; return (
O que ele faz

O que você fazia na planilha, agora acontece sozinho.

{items.map((b, idx) => (
{b.t}
{b.s}
))}
); } // ── Pra quem é — os três perfis (mobile) ───────────────────────── function MobilePerfis() { const perfis = [ { // `perfil` decide pra qual app o CTA manda (ver app-urls.js). perfil: 'autonomo', cta: 'Testar como autônomo', i: IconBolt, t: 'Vendedor autônomo', s: 'MEI, afiliado, infoprodutor. Hotmart, Kiwify, Eduzz, Braip, Guru. Registra manual ou por link rastreável e a venda confirmada cai no painel. Vende um a um ou roda tráfego pago com ROI por produto.', }, { perfil: 'comissionado', cta: 'Entrar com código da empresa', i: IconUsers, t: 'Vendedor de empresa', s: 'Entra pelo link único que a empresa manda, já vinculado. Vê comissão a receber, pagas e o histórico do que é seu, em tempo real com o painel da empresa.', }, { perfil: 'empresa', cta: 'Abrir painel da empresa', i: IconLayers, t: 'Empresa', s: 'Top vendedores, produtos atribuídos, pagar comissão na ordem que quiser, prazo de cada uma, faturamento por produto e um link de acesso pra cada vendedor.', }, ]; return (
Pra quem é

Três jeitos de usar o Comissa.

{perfis.map((b, idx) => (
{b.t}
{b.s}
))}
); } // CTA do card de perfil no mobile: manda direto pro cadastro do app daquele // perfil, sem passar pelo modal de escolha. function MobilePerfilCTA({ perfil, label }) { const [indo, setIndo] = _mss(false); return ( ); } // ── Novo no Comissa (mobile) ───────────────────────────────────── function MobileNovidades() { const items = [ { i: IconClock, t: 'Previsão de recebimento', s: 'Hotmart D+30, Kiwify D+14… O Comissa calcula quando cada valor cai na conta e mostra no calendário.' }, { i: IconTarget, t: 'Score de produto', s: 'Volume, ticket médio, conversão do link e tendência de 2 semanas viram um score automático por produto.' }, { i: IconGrid, t: 'Vagas por produto', s: 'Limite de vagas com barra de progresso, aviso nas últimas 5 e link que fecha sozinho quando esgota.' }, { i: IconRoute, t: 'Link rastreável', s: 'Sem acesso ao gateway? Gera o seu link por oferta e acompanha clique e conversão.' }, { i: IconCircle, t: 'Cidade pelo DDD', s: 'O telefone do cliente vira cidade no mapa. Brasil por DDD, LATAM e Espanha por código de país.' }, { i: IconSearch, t: 'Diagnóstico do dia', s: 'Quanto entrou ontem, o que vem essa semana e qual produto precisa de atenção, logo na entrada.' }, ]; return (
Novo no Comissa

Saiu do forno.

{items.map((b, idx) => (
{b.t}
{b.s}
))}
); } // ── Ranking equipe — pódium nativo mobile (sem scale, sem corte) ─ function MobilePodium() { const podium = [ { n: 'Marina', ini: 'MS', hue: 14, v: 'R$ 32,4k', m: 86, pos: 1 }, { n: 'João', ini: 'JP', hue: 30, v: 'R$ 28,7k', m: 72, pos: 2 }, { n: 'Carla', ini: 'CO', hue: 42, v: 'R$ 19,2k', m: 48, pos: 3 }, ]; const heights = { 1: 140, 2: 104, 3: 76 }; const order = [2, 1, 3]; const barDelay = { 1: 150, 2: 0, 3: 300 }; const avDelay = { 1: 880, 2: 740, 3: 1020 }; const rootRef = _msr(null); const [play, setPlay] = _mss(false); _mse(() => { const el = rootRef.current; if (!el) return; const io = new IntersectionObserver((entries) => { entries.forEach((e) => { if (e.isIntersecting) { setPlay(true); io.unobserve(el); } }); }, { threshold: 0.25 }); io.observe(el); return () => io.disconnect(); }, []); return (
Ranking · Maio
AO VIVO
{order.map((pos) => { const p = podium.find(x => x.pos === pos); const isFirst = pos === 1; return (
{isFirst && ( )}
{p.n}
{p.v}
{pos}
{p.m}%
); })}
); } function MobileRanking() { return (
Equipe

Quem vende mais?
Todo mundo sabe.

Ranking ao vivo, comissão de cada um, progresso pra meta da equipe.

    {[ { i: , l: 'Metas individuais e da equipe' }, { 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 do time' }, ].map((x) => (
  • {x.i} {x.l}
  • ))}
); } // ── Depoimentos (stacked) ──────────────────────────────────── function MobileQuotes() { 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 (
Quem vende com a gente

Carro, curso, relógio, imóvel. Tudo num só painel.

{quotes.map((q, i) => (
{[0,1,2,3,4].map((s) => ())}
“{q.q}”
x[0]).join('')} hue={q.hue} size={28} />
{q.n}
{q.r}
))}
); } // ── Antes vs Agora ─────────────────────────────────────────── function MobileBeforeAfter() { const [side, setSide] = _mss('antes'); _mse(() => { const t = setInterval(() => setSide((s) => (s === 'antes' ? 'agora' : 'antes')), 3600); return () => clearInterval(t); }, []); const blocks = { antes: { title: 'Domingo de noite', sub: 'fechando a planilha', bg: 'linear-gradient(160deg, #FFF4E2 0%, #FFE9C9 100%)', accent: '#F59E0B', lines: [ { i: IconGrid, t: '"Quanto eu vendi mesmo?"', s: 'rolando o Excel pra cima e pra baixo' }, { i: IconCmd, t: 'Calculadora aberta', s: '7% de 12.480 vezes 3... 4... ' }, { i: IconCircle, t: '"O gerente errou de novo"', s: '"essa venda da Marina foi minha"' }, { i: IconClock, t: '23h47', s: 'amanhã tem reunião 8h' }, ], }, agora: { title: 'Domingo de noite', sub: 'com o Comissa', bg: 'linear-gradient(160deg, #EFF6FF 0%, #DCE9FB 100%)', accent: '#A5C9FF', lines: [ { i: IconBolt, t: 'Push: "+R$ 599 caiu agora"', s: 'cliente fechou via Pix, comissão na conta' }, { i: IconTarget, t: 'Meta do mês: 87%', s: 'falta R$ 2.080 pro bônus' }, { i: IconUsers, t: 'Ranking ao vivo do time', s: 'Marina lidera com R$ 32k' }, { i: IconLayers, t: '23h47', s: 'tô no sofá. tudo certo.' }, ], }, }; const b = blocks[side]; return (
Antes vs Agora

O fim de semana que volta a ser seu.

Toque pra trocar entre os dois, ou deixa rodar.

{/* toggle */}
{['antes', 'agora'].map((k) => ( ))}
{/* card animado */}
{b.sub}
{b.title}
{b.lines.map((l, i) => (
{l.t}
{l.s}
))}
); } // ── Pricing stack ──────────────────────────────────────────── function MobilePricing() { // Espelha os planos do app (i18n.js → plan_*), igual ao desktop. const plans = [ { n: 'Comissa Base', p: 'Grátis', s: 'por 14 dias', d: 'Pra começar sem custo', f: ['Até 3 links rastreáveis', 'Até 50 compradores', 'Até 4 produtos', 'Dashboard do mês atual'], cta: 'Começar grátis', onClick: () => window.openModal('signup'), }, { n: 'Comissa Pro', p: 'R$ 47,90', s: '/mês', d: 'Pra quem vende todo dia', f: ['Até 25 links rastreáveis', 'Compradores ilimitados', 'Até 15 produtos', 'Previsão de recebimento', 'Histórico completo'], cta: 'Testar 14 dias grátis', highlight: true, onClick: () => window.openModal('signup'), }, { n: 'Comissa Max', p: 'R$ 97,90', s: '/mês', d: 'Times e operações maiores', f: ['Links e produtos ilimitados', 'Alerta de produto parado', 'Exportação CSV/PDF', 'Suporte via WhatsApp'], cta: 'Falar com a gente', onClick: () => window.openModal('contact'), }, ]; return (
Preços

Começa de graça. Cresce quando faturar.

Sem fidelidade. Sem letrinha miúda.

{plans.map((p, i) => (
{p.highlight && ( Mais escolhido )}
{p.n}
{p.p} {p.s && {p.s}}
{p.d}
    {p.f.map((x) => (
  • {x}
  • ))}
))}
); } // ── Palavra ciclando (igual desktop CyclingWord) ───────────── function MobileCyclingWord({ words, interval = 2400 }) { const [i, setI] = _mss(0); const [phase, setPhase] = _mss('in'); _mse(() => { 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]} ); } // ── CTA final ──────────────────────────────────────────────── function MobileFinalCTA() { const words = ['Vender.', 'Lucrar.', 'Comissar.', 'Crescer.', 'Bater meta.', 'Faturar.', 'Receber direito.']; return (
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.

); } // ── Footer compacto ────────────────────────────────────────── function MobileFooter() { return ( ); } // ── Composição final ───────────────────────────────────────── // ── As duas pontas (mobile) ────────────────────────────────── // O desktop conta isso com dois painéis lado a lado e uma linha atravessando // o vão. No celular não existe "lado a lado", e encolher as duas capturas pra // 355px de largura entrega texto de 5px — a tela viraria enfeite ilegível. // Então aqui a cena é o ARGUMENTO, não o screenshot: o formulário que se // preenche sozinho em cima, a linha descendo, e a empresa avisada embaixo. // Mesmo relógio do desktop (`useRelayVenda`), então é literalmente a mesma // venda atravessando. function MobDuasPontas() { const { venda, fase } = useRelayVenda(); const registrado = fase >= 4; const chegou = fase >= 5; const cartao = { background: '#fff', borderRadius: 16, padding: 16, border: '0.5px solid var(--line)', }; return (
As duas pontas

Um número só. Ninguém tem a própria versão.

Você registra a venda. No segundo seguinte ela já está no total que a empresa vai pagar, com o mesmo valor e a mesma conta por trás.

Nova venda do link
{[ ['Produto', venda ? venda.produto : '—'], ['Valor', venda ? venda.bruto : '—'], ['Comissão', venda ? `${venda.taxa} · ${venda.com}` : '—'], ].map(([k, v]) => (
{k} {v}
))}
= 3 ? 'var(--indigo)' : 'var(--indigo-soft)', color: fase >= 3 ? '#fff' : 'var(--indigo-text)', transition: 'background .3s ease, color .3s ease', }}> {registrado ? 'Venda registrada' : 'Registrar venda'}
{/* A linha, na vertical: no celular o dado desce, não atravessa. */}
= 3 ? 1 : 0.25, transition: 'opacity .35s ease', }}> = 3 ? 1 : 0, transition: 'top .9s cubic-bezier(.4,.1,.2,1), background .5s ease, box-shadow .5s ease, opacity .3s ease', }} />
= 3 ? 1 : 0, transition: 'opacity .35s ease', }}>a mesma venda
Comissa Empresa · notificações
AS
Arthur vendeu {venda ? venda.produto : ''}
{venda ? `${venda.bruto} · a pagar ${venda.com}` : ''}
Já entrou no total do ciclo. Ninguém digitou de novo, e nenhum dos dois lados precisa conferir a planilha do outro.
); } // ── Depois do fechamento: parcelas de boleto (mobile) ──────── // Não existia no celular. O visitante que vende parcelado — corretor, carro, // imóvel, curso em 6x — chegava no preço sem nunca ter lido a resposta da // única pergunta dele: "quando essa comissão fica minha?". function MobParcelas() { const PARCELAS = [ { n: '1/6', quando: '10/06', st: 'paga', com: '+R$ 75' }, { n: '2/6', quando: '10/07', st: 'paga', com: '+R$ 75' }, { n: '3/6', quando: '10/08', st: 'atrasada', com: 'retida' }, { n: '4/6', quando: '10/09', st: 'aberta', com: 'a receber' }, { n: '5/6', quando: '10/10', st: 'aberta', com: 'a receber' }, { n: '6/6', quando: '10/11', st: 'aberta', com: 'a receber' }, ]; const COMO = [ ['O plano nasce da venda', 'Você marca 6x no boleto e o Comissa cria as seis parcelas com data e valor. Você não digita nenhuma.'], ['A comissão segue o dinheiro', 'Cada parcela paga libera a sua fatia dela. Nada de comissão cheia na assinatura pra ser estornada se o cliente parar no meio.'], ['A baixa não duplica', 'Quem avisa o pagamento é a plataforma de cobrança, e cada parcela é única por venda e número.'], ['Atrasou? Fica visível', 'A parcela vencida entra em vermelho, a cobrança é reenviada e a comissão fica retida até o boleto ser pago.'], ]; const cor = (st) => st === 'paga' ? 'var(--green-text)' : st === 'atrasada' ? 'var(--rose-text)' : 'var(--indigo-text)'; return (
Depois do fechamento

A venda fecha. O resto anda sozinho.

Venda parcelada é comissão parcelada — e você vê cada pedaço chegando.

Venda de R$ 4.500 em 6x no boleto, comissão de 10% — R$ 450 no total, R$ 75 por parcela paga.
{PARCELAS.map((p) => (
{p.n} R$ 750,00 {p.quando} {p.com}
))}
{[ ['liberado', 'R$ 150', 'var(--green-text)'], ['retido', 'R$ 75', 'var(--rose-text)'], ['a receber', 'R$ 225', 'var(--indigo-text)'], ].map(([l, v, c]) => (
{v}
{l}
))}
Vale pra boleto e Pix parcelado. Cartão parcelado cai inteiro pela plataforma, então ali a comissão sai de uma vez.
{COMO.map(([t, d], i) => (
{String(i + 1).padStart(2, '0')}
{t}
{d}
))}
); } function MobileSite() { return (
{/* A faixa de plataformas saiu a pedido, junto com a do desktop. `MobPlataformas` segue definida em narrative.jsx. */} {/* Narrativa (narrative.jsx) — a mesma do desktop, em coluna: dor → diagnóstico → virada → jornada → plataformas. */} {/* As duas pontas entram aqui, mesma posição do desktop: depois das plataformas e da prova social, antes do tour do app. */} {/* Pós-venda / parcelas: não existia no celular. */}
); } Object.assign(window, { useDevice, MobileSite });