// LifeOSmax — light Apple-style landing with sales copy const { useState, useEffect } = React; // =========== APPLE CAMPAIGN TOKENS =========== // App Store Connect → App Analytics → Sources mostra atribuição por campanha. // IDs reais ficam em window.LIFEOS (preenchidos após publish na App Store). function appStore(campaign) { const cfg = window.LIFEOS || {}; const id = cfg.appStoreId || '0000000000'; const pt = cfg.applePt || 'TEAM_ID'; const ct = encodeURIComponent(campaign || 'unknown'); return `https://apps.apple.com/br/app/lifeosmax/id${id}?pt=${pt}&ct=${ct}&mt=8`; } function webLogin(email) { const cfg = window.LIFEOS || {}; const base = cfg.webLoginUrl || 'http://localhost:8080/login'; const value = (email || '').trim(); if (!value) return base; const url = new URL(base, window.location.origin); url.searchParams.set('email', value); return url.toString(); } function webSignup(email) { const cfg = window.LIFEOS || {}; const base = cfg.webSignupUrl || 'http://localhost:8080/login?mode=signup'; const value = (email || '').trim(); const url = new URL(base, window.location.origin); if (value) url.searchParams.set('email', value); return url.toString(); } function normalizeEmail(value) { return (value || '').trim().toLowerCase(); } function isValidEmail(value) { return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value) && value.length <= 254; } async function checkSignupEmailExists(rawEmail) { const cfg = window.LIFEOS || {}; const normalizedEmail = normalizeEmail(rawEmail); const supabaseUrl = cfg.supabaseUrl; const supabaseAnonKey = cfg.supabaseAnonKey; if (!supabaseUrl || !supabaseAnonKey) { throw new Error('Variáveis do Supabase não encontradas.'); } const response = await fetch(`${supabaseUrl}/functions/v1/check-signup-email`, { method: 'POST', headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${supabaseAnonKey}`, apikey: supabaseAnonKey, }, body: JSON.stringify({ email: normalizedEmail }), }); const payload = await response.json().catch(() => null); if (!response.ok || !payload?.success) { throw new Error(payload?.error || 'Não foi possível verificar este e-mail.'); } return Boolean(payload.exists); } // =========== TELEMETRY (CTR + page_view) =========== // Edge Function pública — sem credencial no client. // Fire-and-forget via fetch keepalive (sobrevive a navegação do link). function track(eventType, props) { const cfg = window.LIFEOS || {}; const endpoint = cfg.trackingEndpoint; if (!endpoint) return; try { const qs = new URLSearchParams(window.location.search); const payload = { event_type: eventType, cta_location: (props && props.location) || null, cta_campaign: (props && props.campaign) || null, page_url: window.location.href.slice(0, 500), referrer: document.referrer ? document.referrer.slice(0, 500) : null, utm_source: qs.get('utm_source'), utm_medium: qs.get('utm_medium'), utm_campaign: qs.get('utm_campaign'), utm_term: qs.get('utm_term'), utm_content: qs.get('utm_content'), user_agent: (navigator.userAgent || '').slice(0, 400), screen_w: window.innerWidth || null, screen_h: window.innerHeight || null, }; fetch(endpoint, { method: 'POST', keepalive: true, headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(payload), }).catch(() => {}); } catch (e) {} } // Handler genérico pra CTA — dispara track sem bloquear navegação function ctaClick(location, campaign) { return () => track('cta_click', { location, campaign }); } // Page view automático no mount (uma vez por sessão) let pageViewSent = false; function usePageView() { useEffect(() => { if (pageViewSent) return; pageViewSent = true; track('page_view'); }, []); } const I = ({ n, size = 18, color, sw = 1.75, style }) => ( ); // Compass logo (from DS) — used in nav + footer function CompassLogo({ size = 40 }) { return ( N ); } // =============== NAV =============== function Nav() { const [scrolled, setScrolled] = useState(false); useEffect(() => { const on = () => setScrolled(window.scrollY > 20); on(); window.addEventListener('scroll', on, { passive: true }); return () => window.removeEventListener('scroll', on); }, []); return ( ); } // =============== HERO =============== function Hero() { const [webAccessValue, setWebAccessValue] = useState(''); const [webAccessStatus, setWebAccessStatus] = useState('idle'); const [webAccessError, setWebAccessError] = useState(''); useEffect(() => { const resetWebAccessState = () => setWebAccessStatus('idle'); const resetOnVisible = () => { if (document.visibilityState === 'visible') resetWebAccessState(); }; window.addEventListener('pageshow', resetWebAccessState); window.addEventListener('focus', resetWebAccessState); document.addEventListener('visibilitychange', resetOnVisible); return () => { window.removeEventListener('pageshow', resetWebAccessState); window.removeEventListener('focus', resetWebAccessState); document.removeEventListener('visibilitychange', resetOnVisible); }; }, []); const submitWebAccess = async (event) => { event.preventDefault(); const email = normalizeEmail(webAccessValue); if (!isValidEmail(email)) { setWebAccessError('Digite um e-mail válido.'); return; } setWebAccessStatus('checking'); setWebAccessError(''); track('cta_click', { location: 'hero_web_access', campaign: 'web_access' }); try { const exists = await checkSignupEmailExists(email); window.location.href = exists ? webLogin(email) : webSignup(email); } catch (error) { setWebAccessStatus('idle'); setWebAccessError(error?.message || 'Não foi possível verificar este e-mail.'); } }; return (

Sua vida em
equilíbrio.

Finanças, viagens — num só app

Baixar grátis Ver como funciona
App Store
Disponível para iPhone

Quer ter uma experiência web? Acessa por aqui.

{ setWebAccessValue(event.target.value); if (webAccessError) setWebAccessError(''); }} aria-label="E-mail para acessar a experiência web" disabled={webAccessStatus === 'checking'} required /> {webAccessError ?

{webAccessError}

: null}
); } // =============== FEATURE ROW (alternating) =============== function FeatureRow({ id, reverse, color, tag, title, lead, bullets, cta, visual }) { return (
{tag}

{title}

    {bullets.map((b, i) => (
  • {String(i + 1).padStart(2, '0')}
  • ))}
{cta}
{visual}
); } // =============== FINANCE VISUAL (dashboard widget) =============== function FinanceVisual() { return (
Patrimônio total
4 contas conectadas
+12,4% no mês
R$47.328,50
Saldo projetado · maio · 2026
{/* dots */} {/* x-axis labels */} jan fev mar abr mai
Salário · MeuEmpregador Inc.
Hoje · CC Itaú · auto-categorizado
+R$ 7.420,00
Padaria Santa Clara IA
09:32 · Nubank débito · Alimentação
−R$ 35,00
Enel · Energia elétrica
15 mai · Débito automático
−R$ 187,40
Próximas contas a pagar
R$ 3.180,00
); } // =============== VIAGENS — full-bleed travel section =============== function ViagensSection() { return (
02 · Viagens

Cada destino
ganha sua própria
gestão.

Você planeja a viagem, define um orçamento, e o LifeOSmax separa esses gastos do seu mês. Quando volta, sabe exatamente quanto custou — sem confundir com o supermercado e a conta de luz.

Em 25 dias R$ 18.420 · 73%
Nova York
10 → 14 jun · 4 dias · 2 pessoas
Orçamento
73%
Confirmada R$ 14.820
Lisboa
03 → 12 jun · 9 dias
Em 67 dias R$ 6.200
Santiago
22 → 26 jul · 5 dias
{[ { n: '01', t: 'Voo & hotel num lugar', s: 'Cole o e-mail da confirmação, a IA extrai datas, horários e localizador.' }, { n: '02', t: 'Orçamento que prevê', s: 'Câmbio em tempo real, sugestão de gasto diário com base no destino.' }, { n: '03', t: 'Roteiro dia a dia', s: 'Atividades, restaurantes, check-ins — tudo num timeline visual.' }, { n: '04', t: 'Volta com relatório', s: 'PDF do que custou, do que sobrou, do que valeu — pra próxima vez.' }, ].map(item => (
{item.n}

{item.t}

{item.s}

))}
); } // =============== AI SECTION =============== function AISection() { return (
03 · Inteligência

Tire foto.
A IA faz o resto.

Aponta a câmera pro recibo de papel, pra fatura no PDF, pro print do cartão. O LifeOSmax lê, classifica e lança nas suas finanças em três segundos, com 98% de confiança média.

Powered by GPT-4o Vision
1 Capturar

Foto. PDF.
Print do app.

PADARIA SANTA CLARA
Pão chapa18,00
Café leite9,50
Pão queijo7,50
TOTAL35,00

Funciona com qualquer formato — recibo amassado, NF-e, fatura PDF, captura do app do banco.

2 Processar

IA destrincha
em 3 segundos.

merchantamountdatecategorytax

Reconhece o estabelecimento, identifica a categoria, separa impostos, detecta parcelamento.

3 Lançar

Pronto.
Confere e aprova.

Estab.Pad. Santa Clara
ValorR$ 35,00
CategoriaAlimentação · fora
ContaNubank · débito
Conf.98%

Você revisa só o que a IA marcou como incerto. O resto entra direto nas suas finanças.

); } // =============== PILARES VISUAL =============== function PillarsVisual() { const pillars = [ { name: 'Finanças', sub: 'Reserva: 64% da meta', pct: 64, c: '#10B981', ic: 'wallet' }, { name: 'Viagens', sub: 'Nova York em 25 dias', pct: 78, c: '#F59E0B', ic: 'plane' }, ]; return (
Seus pilares
Dois pilares, uma vida em equilíbrio.
{pillars.map(p => (
{p.name} {p.sub}
{p.pct}%
))}
); } // =============== PLATFORMS =============== function Platforms() { return (
05 · Feito para iPhone

Nativo no iOS.
Pensado pra iPhone.

Não é um site embrulhado. É um app nativo, com integração real ao iOS — Face ID, widgets, notificações e atalhos via Siri.

01 — Segurança

Face ID & Keychain

Autenticação biométrica e armazenamento seguro nativo do iOS. Seus dados ficam criptografados no enclave do iPhone.

iOS 16+
02 — Produtividade

Widgets & Atalhos

Widgets na tela inicial mostram saldo e próxima viagem. Atalhos via Siri pra registrar gastos com a voz.

Home Screen
03 — Offline-first

Sempre disponível

Lance transações sem internet. Quando voltar a conectar, tudo sincroniza em segundos — sem perda de dados.

Sync automático
Face ID Offline-first Atalhos Siri Widgets Notificações push
); } // =============== SECURITY =============== function Security() { return (
06 · Privacidade

Seus dados.
Suas regras.

Tratamos privacidade financeira como direito fundamental — não como argumento de venda. Sem revenda, sem "anonimizado", sem letrinha miúda.

01

Criptografia end-to-end

Seus dados saem do dispositivo já criptografados (AES-256, TLS 1.3). Nem nossos engenheiros conseguem ler suas transações.

02

LGPD por design

Exportação completa em JSON ou CSV, com um toque. Apagamento total em até 24h. Você pede, a gente cumpre — sem retenção, sem ligação.

03

Biometria nativa

Face ID e Keychain nativo do iOS. Sem senha pra esquecer, sem senha pra vazar em data breach.

04

Você controla a IA

Use a IA integrada nos planos pagos ou cadastre sua própria chave de IA no plano Business. Seus tokens, seu jogo, seus prompts.

); } // =============== PRICING =============== function Pricing() { const tiers = [ { tag: 'Free', name: 'Comece sem cartão.', price: '0', period: 'sempre', blurb: 'Pra experimentar o essencial — sem pressa, sem trial countdown.', ftrs: [ '20 lançamentos por mês', '1 conta bancária', '1 cartão de crédito', '3 viagens planejadas · 6 realizadas', '2 análises com IA por dia', ], cta: 'Baixar grátis', }, { tag: 'Premium', mark: 'Mais escolhido', featured: true, name: 'Pra quem leva a sério.', price: '29,90', period: 'mês', blurb: 'O essencial pra quem usa o app todo dia, sem se preocupar com limites estreitos.', ftrs: [ '50 lançamentos por mês', '4 contas bancárias · 4 cartões', '10 lançamentos com IA por dia', '10 viagens planejadas · 50 realizadas', 'Calculadora integrada', 'Sincronização com Agenda Google', ], cta: 'Assinar Premium', }, { tag: 'Business', name: 'A família inteira.', price: '49,90', period: 'mês', blurb: 'Pra famílias e equipes que organizam juntas, com mais espaço e IA própria.', ftrs: [ 'Tudo do Premium', '10 contas · 10 cartões', '200 lançamentos por mês', '20 lançamentos com IA por dia', '100 viagens', 'Multiusuário (até 4 membros)', 'API de IA própria', ], cta: 'Assinar Business', }, ]; return (
07 · Planos

Comece grátis.
Cresça se fizer sentido.

Sem letrinha miúda. Sem trial countdown. Cancele com 1 toque, no app, sem precisar ligar pra ninguém.

{tiers.map((t, i) => (
{t.tag} {t.mark && {t.mark}}

{t.name}

R$ {t.price} /{t.period}

{t.blurb}

    {t.ftrs.map((f, j) => (
  • {f}
  • ))}
{t.cta}
))}
); } // =============== FAQ =============== function FAQ() { const [open, setOpen] = useState(0); const items = [ { q: 'Os meus dados ficam seguros mesmo?', a: 'Sim. Tudo é criptografado em trânsito (TLS 1.3) e em repouso (AES-256). Não vendemos seus dados, nem usamos pra treinar modelos. Exportação ou apagamento total em até 24h, a qualquer momento — direito garantido pela LGPD.' }, { q: 'Como funciona a IA, na prática?', a: 'A IA lê recibos, faturas e extratos em PDF que você envia, categoriza automaticamente os lançamentos e ajuda a planejar viagens. O plano Business permite cadastrar sua própria chave de IA. Processamos apenas o que você envia — nada em background.' }, { q: 'Funciona offline?', a: 'Sim. O app é offline-first: você lança transações, edita viagens e fecha tarefas mesmo sem internet. Quando voltar a conectar, tudo sincroniza automaticamente em segundos.' }, { q: 'Em quais plataformas funciona?', a: 'Hoje o LifeOSmax está disponível exclusivamente para iPhone, com integração nativa ao iOS (HealthKit, notificações, atalhos). Versão para outras plataformas ainda não está no roadmap.' }, { q: 'Como cancelo a assinatura?', a: 'Diretamente no app, em Ajustes → Assinatura → Cancelar (gerenciado via App Store). Sem ligação, sem formulário de retenção. Você mantém o acesso até o fim do ciclo já pago.' }, { q: 'Tem versão para empresa ou time?', a: 'O LifeOSmax é focado em uso pessoal e familiar. O plano Business permite até 4 membros (família). Para uso corporativo, escreve em atendimento@lifeosmax.com.' }, ]; return (
08 · FAQ

Antes que
pergunte.

Se tiver dúvida que não está aqui, escreve pra gente por email. A gente responde em até 24 horas em dias úteis.

atendimento@lifeosmax.com
{items.map((it, i) => (
{it.a}
))}
); } // =============== CLOSER =============== function Closer() { return (

Pronto pra movimentar
seus pilares?

Grátis pra começar. 30 segundos pra criar conta. Zero burocracia, zero cartão de crédito exigido.

Grátis pra começar Sem cartão de crédito Cancele com 1 toque LGPD compliant
); } // =============== FOOTER =============== function Footer() { return ( ); } // =============== APP =============== function App() { useEffect(() => { if (window.lucide) window.lucide.createIcons(); }, []); usePageView(); return (